Introduction
In this project, we’re examining inspection scores for restaurants in and around Austin, Texas, from 2014 through early 2017. Scores are determined through routine inspections, usually conducted twice a year. If a score lower than 70 is recorded in a yearly inspection, the restaurant will be subjected to one or more followup visits to ensure a return to compliance. All of our restaurant inspection records include geographical information in the form of zip codes, allowing the use of additional datasets to further explore the data. Visit https://data.world/kvaughn/s-17-dv-project-6 to explore our datasets, or see below for the visualizations we’ve made of the data.
R Configuration
Below we display our sessionInfo().
Visualizations
Interesting Things
Chinatown
Generally speaking, low scores are outliers for restaurants. The inspector caught them on a bad day, perhaps. Look at the histogram for an indication of the proportion of passing scores (above 70) versus failing scores.
If you’re interested in seeing the whole collection of scores for a restaurant with at least one low score, use our Shiny boxplot and select the zipcode of interest. Some restaurants demonstrate a trend in their low scores that goes beyond “one bad day”. Chinatown, in 78731, is a good example of this. A score of 70 or higher is considered ‘passing,’ while a score below 70 triggers an automatic reinspection of the facility. Restaurants are encouraged to aim for scores approaching 100. Chinatown is apparently just aiming to pass. With an average score of 71, it’s meeting its goal.
The Limitations of our Dataset
We originally expected strong correlations between the number of restaurants in a given zip code and the population of that zip code, with an expectation that downtown would be an outlier (lots of restaurants, relatively few residents). When we graphed our data, we found that restaurant quantity and population were only weakly correlated, and we found a number of unexpected outliers.
Similarly, we expected that the number of transit stops would be strongly correlated with the number of restaurants in a given zipcode. This time, our data supported our expectations, with a moderately strong correlation of 0.756.
Curiosity then led us to plot population versus number of transit stops for a given zipcode; again, the two were only weakly correlated, with many of the same outliers.
This prompted a closer look at those outliers, and demonstrated a shortcoming in our dataset. It turns out that the outliers with large populations and few transit stops or restaurants are in the far suburbs of Austin. These areas are governed by other civic bodies, and thus the bulk of their restaurant inspections (and, potentially, transit) will be conducted by an entity other than the City of Austin. In order to get a cleaner view of the relationship between population, transit, and restaurant density, we would need to adjust our data to only include areas under the jurisdiction of the City of Austin. A good visualization of this distribution can be seen below.
Compare this to the map of the boundaries of the City of Austin, courtesy of MapTechnica:
Restaurant Density and Non-native Population
The United States Census provides information on the number of residents per zipcode that are native citizens, as well as how many residents are naturalized citizens or noncitizens. For the purposes of this visualization, we’ve grouped “naturalized citizens” and “noncitizens” into one category, “non-native.” Would zipcodes with relatively high percentages of non-native residents be more or less restaurant-heavy than zipcodes with lower percentages of non-native residents? It turns out that zip codes with high percentages (in the case of this visualization, 25% or more) non-native residents do in fact have significantly more restaurants on average than other zipcodes.
Visualizations using Tableau
Boxplot using Tableau
Raw Scores- Histogram
As can be seen in the visualization below, the most common raw restaurant inspection score is between 90 and 100. The 90-95 and 95-100 bins are essentially the same. The second most common ranges are 85-90 and 100-105. These are also the same size, but a little over half the size of the most common score range.
The next largest bin is half the size of the second largest, and this pattern continues until we drop below 70. This is particularly good news, as it implies that failing scores (those below 70) are not very common at all, and furthermore that exceptional scores are highly common.
CapMetro Stops and Restaurant Density as they Relate to Population- Scatterplot
Here we see a comprehensive visualization that reflects data as we’ve seen it before, in our “interesting things” section. This scatterplot shows restaurant and stop density per zipcode. Each point is sized by the population of that zipcode. Ultimately, we see an overall positive trend. However, upon closer examination, it is clear that many high population zipcodes have a lower restaurant and stop density.
The implications of this have already been discussed in previous sections. However, it is also interesting to note that many zipcodes (regardless of population size), are grouped towards the lower to medium restaurant and stop density area. In fact, the further out in either direction you go, the less instances there are. This likely shows that while there is a slight positive correlation between stop and restaurant density, most areas are not likely to have an exceptional number of eihter.
Visualizations using Shiny in R
The screenshots and descriptions below are based on our interactive visualization app, accessible at https://kvaughn.shinyapps.io/restaurant_inspection/.
Boxplot Visualization using Shiny in R
One low score does not indicate a systemic problem with a restaurant’s cleanliness; before judging a restaurant with a low score, it behooves us to consider the other scores it has received. This boxplot allows the user to do just that. First select a cutoof point for scores, then choose a zipcode to see all restaurants that have scored below that level at least one. Each restaurant’s scores will display, giving the user an idea of whether the low score was a fluke or a sign of problems.
Histogram Visualization using Shiny in R
This visualization allows the user to get a broader view of the restaurant inspection scores. The user is given the option to select scores from any combination of years. What’s interesting here is that the vast majority of restaurant inspections result in “passing” grades of 70 or higher.
Crosstab Visualizations using Shiny in R
Click here to be taken to our published Shiny app: https://kvaughn.shinyapps.io/restaurant_inspection/
Safety Index
This visualization starts with a somewhat-arbitrary KPI, the “Safety Index,” that takes into account both the average score and the lowest inspection score received for a given zip code in a given year. A high Safety Index indicates both a high average score and a high minimum score. Set the parameters however you like (3 and 8 are reasonable defaults) and check the crosstab to see each zip code’s ratings over the four-year period.
Lowest Inspection Scores
This visualization allows the user to set an arbitrary cutoff point as an aid for identifying low inspection scores. The default value, 70, is the cutoff for restaurant inspections; lower scores will trigger a reinspection. After selecting a parameter using the slider and requesting data, the user can select the “Crosstab” tab to see which zip codes and years had unacceptably low inspection scores.
People per Restaurant
Austin is a fast-growing city, and our restaurant scene is currently booming as well. This visualization allows a user to see where the density of restaurants compared to population is highest. Using a public population dataset generated by the US Census, we can find the number of people per restaurant in a given zip code; as more restaurants are added (or fail), the people-per-restaurant number changes. The default values highlight the density of restaurants in 78701, which is downtown Austin.
Barchart Visualizations using Shiny in R
These visualizations are also accessible at https://kvaughn.shinyapps.io/restaurant_inspection/
Scores by Zip Code
Barcharts can be a good way to quickly identify trends visually. In this visualization, the user can create a set of zip codes of interest, then see each zipcode’s average score per year over the three or four years contained in the dataset.
Transit stops and restaurant density
Capital Metro, the Austin-area transit service, has made its data freely available for public download. By importing this data into geographic information software (ArcGIS) and overlaying the coordinates of transit stops on a shapefile of regional zip codes, we were able to count the number of transit stops per zip code. In this bar chart, we’re examining the relationship between transit density and restaurant density. Use the slider to select zip codes with more than the minimum number of transit stops, then compare the number of restaurants in these zip codes to the average number of restaurants per zip code throughout the region. The blue line is the calculated average for all of the selected zip codes, and the red is the grand average for all of the zipcodes in the Greater Austin area.
Nonnative residents and restaurant density
Would we expect zip codes with comparatively large numbers of nonnative (naturalized-citizen or noncitizen) residents to have more or fewer restaurants, on average, than zip codes with lower percentages of nonnative residents? This barchart allows the user to select a minimum percentage of nonnative residents per zip code, then shows the number of restaurants in that zip code and the average number of restaurants per zip code for all of the qualifying zip codes. This average can be compared to the grand average throughout the greater Austin area, shown in red.
<<<<<<< HEAD
LS0tCnRpdGxlOiAiQXVzdGluIFJlc3RhcmFudCBJbnNwZWN0aW9ucyIKYXV0aG9yOiAiPGNlbnRlcj48Yj5NYXJjdXMgTWFydGluZXogYW5kIEthdGUgVmF1Z2huPC9iPjwvY2VudGVyPiIKZGF0ZTogIjxjZW50ZXI+TWF5IDIsIDIwMTc8L2NlbnRlcj4iCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0Ci0tLQoKIyoqSW50cm9kdWN0aW9uKioKIEluIHRoaXMgcHJvamVjdCwgd2UncmUgZXhhbWluaW5nIGluc3BlY3Rpb24gc2NvcmVzIGZvciByZXN0YXVyYW50cyBpbiBhbmQgYXJvdW5kIEF1c3RpbiwgVGV4YXMsIGZyb20gMjAxNCB0aHJvdWdoIGVhcmx5IDIwMTcuICBTY29yZXMgYXJlIGRldGVybWluZWQgdGhyb3VnaCByb3V0aW5lIGluc3BlY3Rpb25zLCB1c3VhbGx5IGNvbmR1Y3RlZCB0d2ljZSBhIHllYXIuICBJZiBhIHNjb3JlIGxvd2VyIHRoYW4gNzAgaXMgcmVjb3JkZWQgaW4gYSB5ZWFybHkgaW5zcGVjdGlvbiwgdGhlIHJlc3RhdXJhbnQgd2lsbCBiZSBzdWJqZWN0ZWQgdG8gb25lIG9yIG1vcmUgZm9sbG93dXAgdmlzaXRzIHRvIGVuc3VyZSBhIHJldHVybiB0byBjb21wbGlhbmNlLiAgQWxsIG9mIG91ciByZXN0YXVyYW50IGluc3BlY3Rpb24gcmVjb3JkcyBpbmNsdWRlIGdlb2dyYXBoaWNhbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiB6aXAgY29kZXMsIGFsbG93aW5nIHRoZSB1c2Ugb2YgYWRkaXRpb25hbCBkYXRhc2V0cyB0byBmdXJ0aGVyIGV4cGxvcmUgdGhlIGRhdGEuICBWaXNpdCBodHRwczovL2RhdGEud29ybGQva3ZhdWdobi9zLTE3LWR2LXByb2plY3QtNiB0byBleHBsb3JlIG91ciBkYXRhc2V0cywgb3Igc2VlIGJlbG93IGZvciB0aGUgdmlzdWFsaXphdGlvbnMgd2UndmUgbWFkZSBvZiB0aGUgZGF0YS4KCiMjKipSIENvbmZpZ3VyYXRpb24qKgpCZWxvdyB3ZSBkaXNwbGF5IG91ciBzZXNzaW9uSW5mbygpLgoKYGBge3IgU2Vzc2lvbkluZm8sIGVjaG89RkFMU0V9IApzZXNzaW9uSW5mbyhwYWNrYWdlPU5VTEwpCmBgYAoKIyoqVGhlIERhdGEqKgpUaGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIGRhdGFzZXQgd2FzIHByb3ZpZGVkIHRocm91Z2ggdGhlIENpdHkgb2YgQXVzdGluJ3MgT3BlbiBEYXRhIFBvcnRhbCwgaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi8uICBUaGlzIGZyZWUgZG93bmxvYWQgaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlIGZvcm1hdHMgYXQgaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi9IZWFsdGgvUmVzdGF1cmFudC1JbnNwZWN0aW9uLVNjb3Jlcy91dGh3LWE3aWguICBGb3IgdGhpcyBwcm9qZWN0LCB3ZSBkb3dubG9hZGVkIGEgQ1NWIGZpbGUgYW5kIGNsZWFuZWQgaXQgdXNpbmcgdGhlIEV4dHJhY3QtVHJhbnNsYXRlLUxvYWQgcHJvY2VkdXJlIG91dGxpbmVkIGJlbG93LgoKIyoqRXh0cmFjdC1UcmFuc2xhdGUtTG9hZCAoRVRMKSoqClRoZSBkYXRhc2V0IHdlIHJlY2VpdmVkIG5lZWRlZCBzb21lIGNsZWFuaW5nLCBhcyBpdCB3YXMgdW5yZWFkYWJsZSB0byBUYWJsZWF1IGluIGl0cyBvcmlnaW5hbCBDU1YgZm9ybWF0dGluZy4gIFdlIHVzZWQgdGhlIEV4dHJhY3QtVHJhbnNsYXRlLUxvYWQgbWV0aG9kIGRpc2N1c3NlZCBpbiBjbGFzcywgYW5kIGJ1aWx0IGFuIFIgc2NyaXB0IGZvdW5kIGF0ICIuLi8wMSBEYXRhL0VUTFJlc3RhdXJhbnQuUiIgIFdlIGFsc28gY2xlYW5lZCB1cCB0aGUgam9pbiBxdWVyeSB1c2VkIGluIG91ciBUYWJsZWF1IHZpc3VhbGl6YXRpb25zOyBpdCBjYW4gYmUgZm91bmQgYXQgIi4uLzAxIERhdGEvRVRMUXVlcnkuUiIgIElmIHlvdSdkIGxpa2UgdG8gZm9sbG93IGFsb25nLCBoZXJlJ3MgaG93IHdlIHByb2Nlc3NlZCB0aGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIGRhdGE6CgojIypTdGVwLUJ5LVN0ZXAgSW5zdHJ1Y3Rpb25zKgoqKkZpcnN0LCBkb3dubG9hZCB0aGUgdW5jbGVhbmVkIENTVjogaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi9hcGkvdmlld3MvZWNtdi05eHhpL3Jvd3MuY3N2P2FjY2Vzc1R5cGU9RE9XTkxPQUQuIFByZXBlbmQgIlByZUVUTF8iIHRvIHRoZSBmaWxlIG5hbWUsIGFuZCBwdXQgaXQgaW4gYSBmb2xkZXIgY2FsbGVkIENTVnMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgcHJvamVjdCAoczE3ZHZwcm9qZWN0NS12YXVnaG4tY2FubmF0YS1tYXJ0aW5leikuKioKCiMjIypTdGVwIDE6IFNldCB1cCB0aGUgZW52aXJvbm1lbnQqCk5vdGUgdGhhdCB3ZSBoYXZlIG9uZSBjb2x1bW4gb2YgbnVtZXJpYyBkYXRhICgiU2NvcmUiKSwgb25lIGNvbHVtbiBvZiBkYXRlcyAoIkluc3BlY3Rpb24gRGF0ZSIpLCB0aHJlZSBjb2x1bW5zIG9mIHN0cmluZ3MgKCJSZXN0YXVyYW50IE5hbWUiLCAiQWRkcmVzcyIsIGFuZCAiUHJvY2VzcyBEZXNjcmlwdGlvbiIpLCBhbmQgdHdvIGNvbHVtbnMgb2YgbnVtZXJpYyBkYXRhIHVzZWQgY2F0ZWdvcmljYWxseSAoIlppcCBDb2RlIiBhbmQgIkZhY2lsaXR5IElEIikuICBGb3IgdGhlIHNha2Ugb2YgZWFzZSBvZiB1c2UsIHRoZXNlIGxhc3QgdHdvIGNvbHVtbnMgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MuCmBgYHtyIGV0bDF9CiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCJ+L3MxN2R2ZmluYWxwcm9qZWN0LXZhdWdobi1jYW5uYXRhLW1hcnRpbmV6LTEvMDAgRG9jcyIpCgojIFNldCBmaWxlcGF0aApmaWxlX3BhdGggPSAiLi4vLi4vQ1NWcy9QcmVFVExfUmVzdGF1cmFudF9JbnNwZWN0aW9uX1Njb3Jlcy5jc3YiCgojIENyZWF0ZSBkYXRhZnJhbWUgZnJvbSBvcmlnaW5hbCBDU1YKZGYgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIFN0YW5kYXJkaXplIGNvbHVtbiBuYW1lcwpuYW1lcyhkZikgPC0gZ3N1YigiXFwuKyIsICIgIiwgbmFtZXMoZGYpKQoKIyBQcmludCBjb2x1bW4gbmFtZXMgYW5kIHR5cGVzCnN0cihkZikKYGBgCgojIyMqU3RlcCAyOiBDb2xsZWN0IGNvbHVtbnMgYnkgdHlwZSoKV2UndmUgZ3JvdXBlZCB0aGUgZGF0ZSBjb2x1bW4gc2VwYXJhdGVseSBmcm9tIG1lYXN1cmVzIGFuZCBkaW1lbnNpb25zOyB3aGlsZSBUYWJsZWF1IHdpbGwgcmVjb2duaXplIHRoZXNlIGRhdGEgYXMgZGF0ZXMsIGl0IHNlZW1zIHBydWRlbnQgdG8gcmVjbGFzc2lmeSB0aGVtIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LgpgYGB7ciBldGwyfQojIFNlbGVjdCBzdHJpbmcgZGF0YSBhcyAnZGltZW5zaW9ucycKZGltZW5zaW9ucyA8LSBjKCJSZXN0YXVyYW50IE5hbWUiLCAiWmlwIENvZGUiLCAiQWRkcmVzcyIsICJQcm9jZXNzIERlc2NyaXB0aW9uIiwgIkZhY2lsaXR5IElEIikKCiMgU2VsZWN0IGRhdGVzIGFzICdkYXRlcycKZGF0ZXMgPC0gYygiSW5zcGVjdGlvbiBEYXRlIikKCiMgU2VsZWN0IGFsbCByZW1haW5pbmcgZGF0YSBhcyAnbWVhc3VyZXMnCm1lYXN1cmVzIDwtIHNldGRpZmYobmFtZXMoZGYpLCB1bmlvbihkaW1lbnNpb25zLCBkYXRlcykpCgpgYGAKCiMjIypTdGVwIDM6IFJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMqCkhlcmUgd2UgcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIGFsbCBvZiBvdXIgZGF0YS4gIFRoZXNlIGNoYXJhY3RlcnMgY2FuIHNlcnZlIG5vIHB1cnBvc2UgaW4gdGhlIGRhdGEsIGFuZCBtaWdodCBjYXVzZSBwcm9ibGVtcyBpbiB0aGUgYW5hbHlzaXMgcHJvY2Vzcy4gIFRvIGltcHJvdmUgcmVhZGFiaWxpdHksIHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgc3BhY2VzLgpgYGB7ciBldGwzfQojIEdldCByaWQgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGVhY2ggY29sdW1uLgpmb3IobiBpbiBuYW1lcyhkZikpIHsKICBkZltuXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltuXSwgZ3N1YiwgcGF0dGVybj0iW14gLX5dIixyZXBsYWNlbWVudD0gIiAiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp9CmBgYAoKIyMjKlN0ZXAgNDogTW9kaWZ5IHJlY29yZHMgaW4gZGltZW5zaW9ucyoKTm93IHdlIGdvIHRocm91Z2ggYWxsIG9mIHRoZSBjaGFyYWN0ZXItYmFzZWQgY29sdW1ucyAoZ3JvdXBlZCBhcyBkaW1lbnNpb25zKSBhbmQgcmVtb3ZlIHRyb3VibGVzb21lIGNoYXJhY3RlcnMuICBBbXBlcnNhbmRzIGFyZSByZXBsYWNlZCB3aXRoICJhbmQiLCBzZW1pY29sb25zIGFyZSByZXBsYWNlZCB3aXRoIGNvbG9ucywgYW5kIHNpbmdsZS0gYW5kIGRvdWJsZS1xdW90ZXMgYXJlIHJlbW92ZWQgb3V0cmlnaHQuICBEYXRhIG9mIE5BIChudWxsKSBpcyByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KYGBge3IgZXRsNH0KIyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSBOQSBkYXRhIHdpdGggYW4gZW1wdHkgc3RyaW5nCm5hMmVtcHR5U3RyaW5nIDwtIGZ1bmN0aW9uICh4KSB7CiAgeFtpcy5uYSh4KV0gPC0gIiIKICByZXR1cm4oeCkKfQojIFdlJ2xsIGFwcGx5IHRoaXMgdG8gYWxsIGNvbHVtbnMgZ3JvdXBlZCBhcyBkaW1lbnNpb25zCmlmKCBsZW5ndGgoZGltZW5zaW9ucykgPiAwKSB7CiAgZm9yKGQgaW4gZGltZW5zaW9ucykgewogICAgIyBDaGFuZ2UgTkEgdG8gdGhlIGVtcHR5IHN0cmluZy4KICAgIGRmW2RdIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW2RdLCBuYTJlbXB0eVN0cmluZyksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICMgR2V0IHJpZCBvZiAiIGFuZCAnIGluIGRpbWVuc2lvbnMuCiAgICBkZltkXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltkXSwgZ3N1YiwgcGF0dGVybj0iW1wiJ10iLHJlcGxhY2VtZW50PSAiIiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICMgQ2hhbmdlICYgdG8gYW5kIGluIGRpbWVuc2lvbnMuCiAgICBkZltkXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltkXSwgZ3N1YiwgcGF0dGVybj0iJiIscmVwbGFjZW1lbnQ9ICIgYW5kICIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAjIENoYW5nZSA6IHRvIDsgaW4gZGltZW5zaW9ucy4KICAgIGRmW2RdIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW2RdLCBnc3ViLCBwYXR0ZXJuPSI6IixyZXBsYWNlbWVudD0gIjsiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIH0KfQoKYGBgCgojIyMqU3RlcCA1OiBNb2RpZnkgZGF0ZXMqCkhlcmUgd2UgZW5zdXJlIHRoYXQgZGF0ZXMgYXJlIGZvcm1hdHRlZCBjb3JyZWN0bHkuCmBgYHtyIGV0bDV9CmlmKCBsZW5ndGgoZGF0ZXMpID4gMSB8fCAhIGlzLm5hKGRhdGVzKSkgewogIGZvcih5IGluIGRhdGVzKSB7CiAgICAjIEZvcm1hdCBhcyBkYXRlcwogICAgZGZbeV0gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZbeV0sIGZ1bmN0aW9uKHkpIGFzLkRhdGUoeSwgZm9ybWF0ID0gIiVtLyVkLyV5IikpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgfQp9CmBgYAoKIyMjKlN0ZXAgNjogTW9kaWZ5IG1lYXN1cmVzKgpOb3cgd2UgdGFrZSBhbGwgb2YgdGhlIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgb3V0IG9mIG91ciBtZWFzdXJlcy4KYGBge3IgZXRsNn0KbmEyemVybyA8LSBmdW5jdGlvbiAoeCkgewogIHhbaXMubmEoeCldIDwtIDAKICByZXR1cm4oeCkKfQojIEdldCByaWQgb2YgYWxsIGNoYXJhY3RlcnMgaW4gbWVhc3VyZXMgZXhjZXB0IGZvciBudW1iZXJzLCB0aGUgLSBzaWduLCBhbmQgcGVyaW9kLmRpbWVuc2lvbnMsIGFuZCBjaGFuZ2UgTkEgdG8gMC4KaWYobGVuZ3RoKG1lYXN1cmVzKSA+IDEgfHwgISBpcy5uYShtZWFzdXJlcykpIHsKICBmb3IobSBpbiBtZWFzdXJlcykgewogICAgZGZbbV0gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZbbV0sIGdzdWIsIHBhdHRlcm49IlteLS0uMC05XSIscmVwbGFjZW1lbnQ9IiIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICBkZlttXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZlttXSwgbmEyemVybyksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgIGRmW21dIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW21dLCBmdW5jdGlvbihtKSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihtKSkpKSAjIFRoaXMgaXMgbmVlZGVkIHRvIHR1cm4gbWVhc3VyZXMgYmFjayB0byBudW1lcmljIGJlY2F1c2UgZ3N1YiB0dXJucyB0aGVtIGludG8gc3RyaW5ncy4KICB9Cn0KYGBgCgojIyMqU3RlcCA3OiBEdW1teSBjaGVjayoKQWx3YXlzIGEgdXNlZnVsIHRoaW5nLiAgTGV0J3MgbG9vayBhdCBvdXIgZGF0YSBhbmQgc2VlIHdoYXQgd2UndmUgZ290LiAgV2UncmUgZXhwZWN0aW5nIGFsbCBkYXRhIHRvIGJlIGluIGNoYXJhY3RlciBmb3JtIGV4Y2VwdCAiU2NvcmUiLCB3aGljaCB3aWxsIGJlIG51bWVyaWMsIGFuZCBvdXIgZGF0ZSBjb2x1bW4gbmFtZWQgIkluc3BlY3Rpb24gRGF0ZSIuCmBgYHtyIGV0bDd9CiMgVGFrZSBhIGxvb2sgYW5kIG1ha2Ugc3VyZSBpdCdzIHdoYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZToKcHJpbnQoc3VtbWFyeShkZikpCmBgYAoKIyMjKlN0ZXAgODogV3JpdGUgdG8gYSBuZXcgZmlsZSoKT3VyIGRhdGEgbG9va3MgZ29vZCwgYW5kIHdlIG5lZWQgdG8gd3JpdGUgaXQgdG8gYSBuZXcgZmlsZS4KYGBge3IgZXRsOH0KIyBOb3cgd3JpdGUgaXQgdG8gYSBuZXcgY2xlYW4gZmlsZS4Kd3JpdGUuY3N2KGRmLCBnc3ViKCJQcmVFVExfIiwgIiIsIGZpbGVfcGF0aCksIHJvdy5uYW1lcz1GQUxTRSwgbmEgPSAiIikKYGBgCgojKipWaXN1YWxpemF0aW9ucyoqCgojIyoqSW50ZXJlc3RpbmcgVGhpbmdzKioKIyMjKipDaGluYXRvd24qKiAgCkdlbmVyYWxseSBzcGVha2luZywgbG93IHNjb3JlcyBhcmUgb3V0bGllcnMgZm9yIHJlc3RhdXJhbnRzLiAgVGhlIGluc3BlY3RvciBjYXVnaHQgdGhlbSBvbiBhIGJhZCBkYXksIHBlcmhhcHMuICBMb29rIGF0IHRoZSBoaXN0b2dyYW0gZm9yIGFuIGluZGljYXRpb24gb2YgdGhlIHByb3BvcnRpb24gb2YgcGFzc2luZyBzY29yZXMgKGFib3ZlIDcwKSB2ZXJzdXMgZmFpbGluZyBzY29yZXMuICAKPGNlbnRlcj4hW0FsbCBTY29yZXMgSGlzdG9ncmFtXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TSGlzdEIucG5nKTwvY2VudGVyPgo8YnI+CklmIHlvdSdyZSBpbnRlcmVzdGVkIGluIHNlZWluZyB0aGUgd2hvbGUgY29sbGVjdGlvbiBvZiBzY29yZXMgZm9yIGEgcmVzdGF1cmFudCB3aXRoIGF0IGxlYXN0IG9uZSBsb3cgc2NvcmUsIHVzZSBvdXIgU2hpbnkgYm94cGxvdCBhbmQgc2VsZWN0IHRoZSB6aXBjb2RlIG9mIGludGVyZXN0LiAgU29tZSByZXN0YXVyYW50cyBkZW1vbnN0cmF0ZSBhIHRyZW5kIGluIHRoZWlyIGxvdyBzY29yZXMgdGhhdCBnb2VzIGJleW9uZCAib25lIGJhZCBkYXkiLiAgQ2hpbmF0b3duLCBpbiA3ODczMSwgaXMgYSBnb29kIGV4YW1wbGUgb2YgdGhpcy4gIEEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyIGlzIGNvbnNpZGVyZWQgJ3Bhc3NpbmcsJyB3aGlsZSBhIHNjb3JlIGJlbG93IDcwIHRyaWdnZXJzIGFuIGF1dG9tYXRpYyByZWluc3BlY3Rpb24gb2YgdGhlIGZhY2lsaXR5LiAgUmVzdGF1cmFudHMgYXJlIGVuY291cmFnZWQgdG8gYWltIGZvciBzY29yZXMgYXBwcm9hY2hpbmcgMTAwLiAgQ2hpbmF0b3duIGlzIGFwcGFyZW50bHkganVzdCBhaW1pbmcgdG8gcGFzcy4gIFdpdGggYW4gYXZlcmFnZSBzY29yZSBvZiA3MSwgaXQncyBtZWV0aW5nIGl0cyBnb2FsLgo8Y2VudGVyPiFbQ2hpbmF0b3duJ3MgQXZlcmFnZSBTY29yZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JveEIucG5nKTwvY2VudGVyPgo8YnI+CgojIyMqKlRoZSBMaW1pdGF0aW9ucyBvZiBvdXIgRGF0YXNldCoqIApXZSBvcmlnaW5hbGx5IGV4cGVjdGVkIHN0cm9uZyBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIGEgZ2l2ZW4gemlwIGNvZGUgYW5kIHRoZSBwb3B1bGF0aW9uIG9mIHRoYXQgemlwIGNvZGUsIHdpdGggYW4gZXhwZWN0YXRpb24gdGhhdCBkb3dudG93biB3b3VsZCBiZSBhbiBvdXRsaWVyIChsb3RzIG9mIHJlc3RhdXJhbnRzLCByZWxhdGl2ZWx5IGZldyByZXNpZGVudHMpLiAgV2hlbiB3ZSBncmFwaGVkIG91ciBkYXRhLCB3ZSBmb3VuZCB0aGF0IHJlc3RhdXJhbnQgcXVhbnRpdHkgYW5kIHBvcHVsYXRpb24gd2VyZSBvbmx5IHdlYWtseSBjb3JyZWxhdGVkLCBhbmQgd2UgZm91bmQgYSBudW1iZXIgb2YgdW5leHBlY3RlZCBvdXRsaWVycy4gIAo8Y2VudGVyPiFbUmVzdGF1cmFudCBieSBQb3B1bGF0aW9uIFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjEucG5nKTwvY2VudGVyPgo8YnI+ClNpbWlsYXJseSwgd2UgZXhwZWN0ZWQgdGhhdCB0aGUgbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMgd291bGQgYmUgc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgaW4gYSBnaXZlbiB6aXBjb2RlLiAgVGhpcyB0aW1lLCBvdXIgZGF0YSBzdXBwb3J0ZWQgb3VyIGV4cGVjdGF0aW9ucywgd2l0aCBhIG1vZGVyYXRlbHkgc3Ryb25nIGNvcnJlbGF0aW9uIG9mIDAuNzU2LiAgCjxjZW50ZXI+IVtSZXN0YXVyYW50IGJ5IFRyYW5zaXQgU2NhdHRlcnBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NTY2F0dGVyMy5wbmcpPC9jZW50ZXI+Cjxicj4KQ3VyaW9zaXR5IHRoZW4gbGVkIHVzIHRvIHBsb3QgcG9wdWxhdGlvbiB2ZXJzdXMgbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMgZm9yIGEgZ2l2ZW4gemlwY29kZTsgYWdhaW4sIHRoZSB0d28gd2VyZSBvbmx5IHdlYWtseSBjb3JyZWxhdGVkLCB3aXRoIG1hbnkgb2YgdGhlIHNhbWUgb3V0bGllcnMuICAKPGNlbnRlcj4hW1RyYW5zaXQgYnkgUG9wdWxhdGlvbiBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIyLnBuZyk8L2NlbnRlcj4gCjxicj4KVGhpcyBwcm9tcHRlZCBhIGNsb3NlciBsb29rIGF0IHRob3NlIG91dGxpZXJzLCBhbmQgZGVtb25zdHJhdGVkIGEgc2hvcnRjb21pbmcgaW4gb3VyIGRhdGFzZXQuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgb3V0bGllcnMgd2l0aCBsYXJnZSBwb3B1bGF0aW9ucyBhbmQgZmV3IHRyYW5zaXQgc3RvcHMgb3IgcmVzdGF1cmFudHMgYXJlIGluIHRoZSBmYXIgc3VidXJicyBvZiBBdXN0aW4uICBUaGVzZSBhcmVhcyBhcmUgZ292ZXJuZWQgYnkgb3RoZXIgY2l2aWMgYm9kaWVzLCBhbmQgdGh1cyB0aGUgYnVsayBvZiB0aGVpciByZXN0YXVyYW50IGluc3BlY3Rpb25zIChhbmQsIHBvdGVudGlhbGx5LCB0cmFuc2l0KSB3aWxsIGJlIGNvbmR1Y3RlZCBieSBhbiBlbnRpdHkgb3RoZXIgdGhhbiB0aGUgQ2l0eSBvZiBBdXN0aW4uICBJbiBvcmRlciB0byBnZXQgYSBjbGVhbmVyIHZpZXcgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcHVsYXRpb24sIHRyYW5zaXQsIGFuZCByZXN0YXVyYW50IGRlbnNpdHksIHdlIHdvdWxkIG5lZWQgdG8gYWRqdXN0IG91ciBkYXRhIHRvIG9ubHkgaW5jbHVkZSBhcmVhcyB1bmRlciB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBDaXR5IG9mIEF1c3Rpbi4gCkEgZ29vZCB2aXN1YWxpemF0aW9uIG9mIHRoaXMgZGlzdHJpYnV0aW9uIGNhbiBiZSBzZWVuIGJlbG93Lgo8Y2VudGVyPiFbRGF0YXNldCBMaW1pdGF0aW9ucyBNYXBdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCT3V0bGllck1hcC5wbmcpPC9jZW50ZXI+Cjxicj4KQ29tcGFyZSB0aGlzIHRvIHRoZSBtYXAgb2YgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIENpdHkgb2YgQXVzdGluLCBjb3VydGVzeSBvZiBNYXBUZWNobmljYToKPGNlbnRlcj4hW0NvQSBCb3VuZGFyaWVzXSguLi8wMyBWaXN1YWxpemF0aW9ucy9DT0FCb3VuZGFyaWVzLnBuZyk8L2NlbnRlcj4KPGJyPgoKIyMjKipSZXN0YXVyYW50IERlbnNpdHkgYW5kIE5vbi1uYXRpdmUgUG9wdWxhdGlvbioqClRoZSBVbml0ZWQgU3RhdGVzIENlbnN1cyBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgbnVtYmVyIG9mIHJlc2lkZW50cyBwZXIgemlwY29kZSB0aGF0IGFyZSBuYXRpdmUgY2l0aXplbnMsIGFzIHdlbGwgYXMgaG93IG1hbnkgcmVzaWRlbnRzIGFyZSBuYXR1cmFsaXplZCBjaXRpemVucyBvciBub25jaXRpemVucy4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uLCB3ZSd2ZSBncm91cGVkICJuYXR1cmFsaXplZCBjaXRpemVucyIgYW5kICJub25jaXRpemVucyIgaW50byBvbmUgY2F0ZWdvcnksICJub24tbmF0aXZlLiIgIFdvdWxkIHppcGNvZGVzIHdpdGggcmVsYXRpdmVseSBoaWdoIHBlcmNlbnRhZ2VzIG9mIG5vbi1uYXRpdmUgcmVzaWRlbnRzIGJlIG1vcmUgb3IgbGVzcyByZXN0YXVyYW50LWhlYXZ5IHRoYW4gemlwY29kZXMgd2l0aCBsb3dlciBwZXJjZW50YWdlcyBvZiBub24tbmF0aXZlIHJlc2lkZW50cz8gIEl0IHR1cm5zIG91dCB0aGF0IHppcCBjb2RlcyB3aXRoIGhpZ2ggcGVyY2VudGFnZXMgKGluIHRoZSBjYXNlIG9mIHRoaXMgdmlzdWFsaXphdGlvbiwgMjUlIG9yIG1vcmUpIG5vbi1uYXRpdmUgcmVzaWRlbnRzIGRvIGluIGZhY3QgaGF2ZSBzaWduaWZpY2FudGx5IG1vcmUgcmVzdGF1cmFudHMgb24gYXZlcmFnZSB0aGFuIG90aGVyIHppcGNvZGVzLgo8Y2VudGVyPiFbTm9uLW5hdGl2ZSBSZXNpZGVudHNdKC4uLzAzIFZpc3VhbGl6YXRpb25zL05vbm5hdGl2ZS5wbmcpPC9jZW50ZXI+Cjxicj4KCgojIyoqVmlzdWFsaXphdGlvbnMgdXNpbmcgVGFibGVhdSoqCgojIyMqKkJveHBsb3QgdXNpbmcgVGFibGVhdSoqCgojIyMqKlJhdyBTY29yZXMtIEhpc3RvZ3JhbSoqCkFzIGNhbiBiZSBzZWVuIGluIHRoZSB2aXN1YWxpemF0aW9uIGJlbG93LCB0aGUgbW9zdCBjb21tb24gcmF3IHJlc3RhdXJhbnQgaW5zcGVjdGlvbiBzY29yZSBpcyBiZXR3ZWVuIDkwIGFuZCAxMDAuIFRoZSA5MC05NSBhbmQgOTUtMTAwIGJpbnMgYXJlIGVzc2VudGlhbGx5IHRoZSBzYW1lLiBUaGUgc2Vjb25kIG1vc3QgY29tbW9uIHJhbmdlcyBhcmUgODUtOTAgYW5kIDEwMC0xMDUuIFRoZXNlIGFyZSBhbHNvIHRoZSBzYW1lIHNpemUsIGJ1dCBhIGxpdHRsZSBvdmVyIGhhbGYgdGhlIHNpemUgb2YgdGhlIG1vc3QgY29tbW9uIHNjb3JlIHJhbmdlLiAKCjxjZW50ZXI+IVtUYWJsZWF1OiBSYXcgU2NvcmUgSGlzdG9ncmFtXSguLi8wMyBWaXN1YWxpemF0aW9ucy9USGlzdC5wbmcpPC9jZW50ZXI+CgpUaGUgbmV4dCBsYXJnZXN0IGJpbiBpcyBoYWxmIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgbGFyZ2VzdCwgYW5kIHRoaXMgcGF0dGVybiBjb250aW51ZXMgdW50aWwgd2UgZHJvcCBiZWxvdyA3MC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgZ29vZCBuZXdzLCBhcyBpdCBpbXBsaWVzIHRoYXQgZmFpbGluZyBzY29yZXMgKHRob3NlIGJlbG93IDcwKSBhcmUgbm90IHZlcnkgY29tbW9uIGF0IGFsbCwgYW5kIGZ1cnRoZXJtb3JlIHRoYXQgZXhjZXB0aW9uYWwgc2NvcmVzIGFyZSBoaWdobHkgY29tbW9uLgoKIyMjKipDYXBNZXRybyBTdG9wcyBhbmQgUmVzdGF1cmFudCBEZW5zaXR5IGFzIHRoZXkgUmVsYXRlIHRvIFBvcHVsYXRpb24tIFNjYXR0ZXJwbG90KioKSGVyZSB3ZSBzZWUgYSBjb21wcmVoZW5zaXZlIHZpc3VhbGl6YXRpb24gdGhhdCByZWZsZWN0cyBkYXRhIGFzIHdlJ3ZlIHNlZW4gaXQgYmVmb3JlLCBpbiBvdXIgImludGVyZXN0aW5nIHRoaW5ncyIgc2VjdGlvbi4gVGhpcyBzY2F0dGVycGxvdCBzaG93cyByZXN0YXVyYW50IGFuZCBzdG9wIGRlbnNpdHkgcGVyIHppcGNvZGUuIEVhY2ggcG9pbnQgaXMgc2l6ZWQgYnkgdGhlIHBvcHVsYXRpb24gb2YgdGhhdCB6aXBjb2RlLiBVbHRpbWF0ZWx5LCB3ZSBzZWUgYW4gb3ZlcmFsbCBwb3NpdGl2ZSB0cmVuZC4gSG93ZXZlciwgdXBvbiBjbG9zZXIgZXhhbWluYXRpb24sIGl0IGlzIGNsZWFyIHRoYXQgbWFueSBoaWdoIHBvcHVsYXRpb24gemlwY29kZXMgaGF2ZSBhIGxvd2VyIHJlc3RhdXJhbnQgYW5kIHN0b3AgZGVuc2l0eS4gCgo8Y2VudGVyPiFbVGFibGVhdTogUmVzdGF1cmFudCBhbmQgU3RvcCBEZW5zaXR5IFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQlNjYXR0ZXJwbG90LnBuZyk8L2NlbnRlcj4KClRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBoYXZlIGFscmVhZHkgYmVlbiBkaXNjdXNzZWQgaW4gcHJldmlvdXMgc2VjdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIGFsc28gaW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IG1hbnkgemlwY29kZXMgKHJlZ2FyZGxlc3Mgb2YgcG9wdWxhdGlvbiBzaXplKSwgYXJlIGdyb3VwZWQgdG93YXJkcyB0aGUgbG93ZXIgdG8gbWVkaXVtIHJlc3RhdXJhbnQgYW5kIHN0b3AgZGVuc2l0eSBhcmVhLiBJbiBmYWN0LCB0aGUgZnVydGhlciBvdXQgaW4gZWl0aGVyIGRpcmVjdGlvbiB5b3UgZ28sIHRoZSBsZXNzIGluc3RhbmNlcyB0aGVyZSBhcmUuIFRoaXMgbGlrZWx5IHNob3dzIHRoYXQgd2hpbGUgdGhlcmUgaXMgYSBzbGlnaHQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBzdG9wIGFuZCByZXN0YXVyYW50IGRlbnNpdHksIG1vc3QgYXJlYXMgYXJlIG5vdCBsaWtlbHkgdG8gaGF2ZSBhbiBleGNlcHRpb25hbCBudW1iZXIgb2YgZWlodGVyLiAKCiMjIyoqQ3Jvc3N0YWItcmVsYXRlZCBWaXN1YWxpemF0aW9ucyB1c2luZyBUYWJsZWF1KioKQmVsb3cgeW91IHdpbGwgZmluZCB0aGUgdmlzdWFsaXphdGlvbnMgd2UgY3JlYXRlZCB1c2luZyBUYWJsZWF1LiBFYWNoIHZpc3VhbGl6YXRpb24gaXMgb25seSBhIGZyYWN0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB2aWV3ZWQgaW4gVGFibGVhdSwgYXMgdGhlc2UgY3Jvc3N0YWJzIGNhbm5vdCBzaG93Y2FzZSBhbGwgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBhdCBvbmNlLiAgT3VyIFRhYmxlYXUgd29ya2Jvb2sgaXMgaW5jbHVkZWQgaW4gb3VyIHJlcG9zaXRvcnkgaW4gdGhlIGZvbGRlciAwMSBEYXRhLgoKIyMjIypJbnNwZWN0aW9uIFNjb3JlcywgQXJlYSwgYW5kIEluY29tZSoKVGhpcyBjcm9zc3RhYiBzaG93cyBieSB5ZWFyIGFuZCB6aXBjb2RlIChpbiBBdXN0aW4pLCB0aGUgYXZlcmFnZSByZXN0YXVyYW50IGluc3BlY3Rpb24gc2NvcmUuIFRoZSBjcm9zc3RhYiBpcyBjb2xvcmVkIGJ5IHRoZSBwZXJjZW50YWdlIG9mIGhvdXNlaG9sZHMgaW4gZWFjaCBhcmVhIHVuZGVyIHRoZSBuYXRpb25hbCBwb3ZlcnR5IGxpbmUgKHB1bGxlZCBmcm9tIFVTIENlbnN1cyBkYXRhKS4gQXMgaXMgZXZpZGVudCwgYXZlcmFnZSBzY29yZXMgcmVtYWluIHJlbGF0aXZlbHkgaGlnaCBhY3Jvc3MgcG92ZXJ0eSBsZXZlbHMgYW5kIHppcGNvZGVzLiBJbiBUYWJsZWF1IHlvdSBhcmUgYWJsZSB0byBjeWNsZSB0aHJvdWdoIHppcGNvZGVzIGluIHRoZSB3ZXN0ZXJuIG9yIGVhc3Rlcm4gaGFsZiBvZiB0aGUgZ3JlYXRlciBBdXN0aW4gYXJlYS4gRXZlbiBhdCB0aGlzIGxldmVsLCBhdmVyYWdlIHNjb3JlcyByZW1haW4gc2ltaWxhci4gVGhlcmUgYXJlIG1vcmUgYXZlcmFnZSBzY29yZXMgYmVsb3cgOTAgaW4gdGhlIGVhc3Rlcm4gc2VjdGlvbiwgYnV0IHRoaXMgaXMgbGlrZWx5IG5vdCBzaWduaWZpY2FudC4KCjxjZW50ZXI+IVtUYWJsZWF1OiBTY29yZXMgYnkgSW5jb21lIGFuZCBBcmVhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9Dcm9zc3RhYkF2ZXJhZ2VTY29yZWJ5UG92ZXJ0eUxldmVsLnBuZyk8L2NlbnRlcj4KCkl0IGlzIHBvc3NpYmxlIHRoaXMgaXMgdW5pcXVlIHRvIEF1c3RpbiwgYW5kIG1heSBiZSBhIGNvbnNlcXVlbmNlIG9mIHN0cmluZ2VudCBmb29kIHNhZmV0eSBjb2RlIGluIHRoZXNlIGFyZWFzLiBGdXJ0aGVyIGFuYWx5c2lzIHdvdWxkIG5lZWQgdG8gYmUgZG9uZSB0byBzZWUgaWYgdGhlc2UgY29ycmVsYXRpb25zIGFyZSB0cnVlIGVsc2V3aGVyZSBpbiB0aGUgVW5pdGVkIFN0YXRlcy4KCiMjIyMqQXZlcmFnZSBJbnNwZWN0aW9uIFNjb3JlcyBHZW9ncmFwaGljYWxseSoKQXMgY2FuIGJlIHNlZW4sIHRoaXMgdmlzdWFsaXphdGlvbiBkaXNwbGF5cyB0aGUgYXZlcmFnZSBpbnNwZWN0aW9ucyBzY29yZSBmb3IgZWFjaCB6aXBjb2RlIGFyZWEuIEVhY2ggemlwY29kZSdzIGNvbG9yIGlzIGRldGVybWluZWQgYnkgaXRzIGF2ZXJhZ2UgaW5zcGVjdGlvbiBzY29yZSdzIHByb3hpbWl0eSB0byB0aGUgZ3JhbmQgYXZlcmFnZSBmb3IgdGhlIHllYXIocykgc2VsZWN0ZWQgaW4gdGhlIGZpbHRlci4gIFRoaXMgaXMgZG9uZSB1c2luZyBhIGNhbGN1bGF0ZWQgZmllbGQsIGFuZCB3aWxsIGJlIHJlY2FsY3VsYXRlZCBhY2NvcmRpbmcgdGhlIHRoZSBkYXRhIHNlbGVjdGVkIGluIHRoZSBZZWFyIGZpbHRlci4gIElmIGFycml2aW5nIGF0IHRoaXMgbWFwIGJ5IGNsaWNraW5nIG9uIGVpdGhlciBvZiB0aGUgY3Jvc3N0YWJzLCB0aGUgemlwIGNvZGVzIHdpbGwgZGlzcGxheSB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBncmFuZCBhdmVyYWdlIG9mIHRoZSBzZWxlY3RlZCB5ZWFyLgoKPGNlbnRlcj4hW1RhYmxlYXU6IE1hcCBvZiBBdmVyYWdlIEluc3BlY3Rpb24gU2NvcmVzXSguLi8wMyBWaXN1YWxpemF0aW9ucy9Dcm9zc3RhYkluc3BlY3Rpb25TY29yZU1hcC5wbmcpPC9jZW50ZXI+CgpJdCBpcyBhZ2FpbiBldmlkZW50IHRoYXQgYXZlcmFnZSBzY29yZXMgYXJlIHJlbGF0aXZlbHkgaGlnaCBhY3Jvc3MgZWFjaCBhcmVhLiAKCiMjIyMqQXZlcmFnZSBTY29yZSBieSBZZWFyKgpUaGlzIGhpZ2hseSBjb21wcmVoZW5zaXZlIHZpc3VhbGl6YXRpb24gc2hvd3MgdXMgdGhyZWUgbWFpbiBwaWVjZXMgb2YgaW5mb3JtYXRpb246IGF2ZXJhZ2Ugc2NvcmUsIG1pbmltdW0gc2NvcmUsIGFuZCBzYWZldHkgaW5kZXguIEFzIGhhcyBiZWVuIHByZXZpb3VzbHkgbm90ZWQsIGF2ZXJhZ2Ugc2NvcmVzIGFyZSByZWxhdGl2ZWx5IGhpZ2ggaW4gZWFjaCB6aXBjb2RlLiBNaW51bXVtIHNjb3JlcyBjYW4gYmUgcXVpdGUgbG93IChvbmUgb2YgdGhlIGxvd2VzdCBzY29yZXMgaXMgMzYpLCBidXQgdGhlc2UgYXJlIGZldyBhbmQgZmFyIGJldHdlZW4uCgo8Y2VudGVyPiFbVGFibGVhdTogQXZlcmFnZSBTY29yZSBieSBZZWFyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9Dcm9zc3RhYlNjb3Jlc2J5WWVhci5wbmcpPC9jZW50ZXI+CgpUaGlzIGNyb3NzdGFiIGlzIGFsc28gY29sb3JlZCBieSBhIFNhZmV0eSBJbmRleC4gIFRoaXMgS1BJIGlzIGJhc2VkIGluIGEgY2FsY3VsYXRlZCBmaWVsZCB0aGF0IGFjY291bnRzIGZvciB0aGUgYXZlcmFnZSBzY29yZSBhbmQgbWluaW11bSBzY29yZSBmb3IgYSBnaXZlbiB6aXAgY29kZSBpbiBhIGdpdmVuIHllYXIsIHRoZW4gcGFyYW1ldGVyaXplZCBpbnRvIExvdywgTWVkaXVtLCBhbmQgSGlnaCByYW5raW5ncy4gIFRoZSBicmVhayBwb2ludCBmb3IgZWFjaCBvZiB0aGVzZSBncm91cGluZ3MgY2FuIGJlIGFkanVzdGVkIHVzaW5nIHRoZSBzbGlkZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Jvc3N0YWIuICAKCiMjIyoqQmFyY2hhcnQtcmVsYXRlZCBWaXN1YWxpemF0aW9ucyB1c2luZyBUYWJsZWF1KioKCiMjIyMqQ2FwTWV0cm8gU3RvcHMgYnkgWmlwY29kZSBhcyB0aGV5IFJlbGF0ZSB0byBSZXN0YXVyYW50IERlbnNpdHkqCkhlcmUgd2Ugc2VlIHZpc3VhbGl6ZWQgdGhlIG51bWJlciBvZiBidXMgc3RvcHMgcGVyIHppcGNvZGUsIGNvbG9yZWQgYnkgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGF0IHppcGNvZGUuIFRoaXMgdmlzdWFsaXphdGlvbiBhbHNvIHNob3dzIGFuIGF2ZXJhZ2UgbGluZSBmb3IgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0b3BzLiBBcyBpcyBldmlkZW50LCB0aGUgemlwY29kZXMgd2l0aCB0aGUgZGFya2VzdCBiYXJzICh0aG9zZSB3aXRoIHRoZSBoaWdoZXN0IHJlc3R1YXJhbnQgZGVuc2l0eSksIGFsbW9zdCBhbHdheXMgc3VycGFzcyB0aGUgYXZlcmFnZSBsaW5lLCBidXQgYWxzbyBnZW5lcmFsbHkgZ3JlYXRseSBzdXJwYXNzIGl0LiBUaGlzIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQgc3VnZ2VzdHMgdGhhdCwgaW4gZ2VuZXJhbCwgemlwY29kZXMgd2l0aCBhIGhpZ2hlciB0aGFuIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ1cyBzdG9wcyBhbHNvIGhhdmUgYSBoaWdoIHJlc3R1YXJhbnQgZGVuc2l0eS4KCjxjZW50ZXI+IVtUYWJsZWF1OiBTdG9wcyBieSBaaXBjb2RlXSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMUEucG5nKTwvY2VudGVyPgo8YnI+CjxjZW50ZXI+IVtUYWJsZWF1OiBTdG9wcyBieSBaaXBjb2RlLCBIaWdoIFJlc3RhdXJhbnQgRGVuc2l0eV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvVEJhcjFCLnBuZyk8L2NlbnRlcj4KCkluIFRhYmxlYXUsIHRoaXMgdmlzdWFsaXphdGlvbiBhbHNvIGFsbG93cyB5b3UgdG8gYWRqdXN0IHdoaWNoIHppcGNvZGVzIGFyZSBkaXNwbGF5ZWQgYmFzZWQgb24gYSBtaW5pbXVtIGFtb3VudCBvZiByZXN0YXVyYW50cywgYW5kIGFsc28gYmFzZWQgb24gd2hldGhlciB0aGUgemlwY29kZXMgYXJlIGFib3ZlIG9yIGJlbG93IHRoaXMgbWluaW11bS4KCiMjIyMqRm9yZWlnbiBQb3B1bGF0aW9uIHZzLiBSZXN0YXVyYW50IERlbnNpdHkqCkhlcmUgd2UgZmluZCBhIHZpc3VhbGl6YXRpb24gdGhhdCBzaG93Y2FzZXMgZm9yZWlnbiBwb3B1bGF0aW9uIGJ5IHppcGNvZGUsIGFuZCBpcyBjb2xvcmVkIHRvIHJlZmxlY3QgdGhlIHJlc3RhdXJhbnQgZGVuc2l0eSBvZiBlYWNoIHppcGNvZGUuIEluIFRhYmxlYXUsIHlvdSBhcmUgYWxzbyBhYmxlIHRvIHRvZ2dsZSBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIGEgaGlnaGVyIHRoYW4gYXZlcmFnZSwgb3IgYW4gYXQvYmVsb3cgYXZlcmFnZSBmb3JlaWduIHBvcHVsYXRpb24uCgo8Y2VudGVyPiFbVGFibGVhdTogUmVzdGF1cmFudCBEZW5zaXR5LCBMb3cgRm9yZWlnbiBQb3B1bGF0aW9uXSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMkEucG5nKTwvY2VudGVyPgo8YnI+CjxjZW50ZXI+IVtUYWJsZWF1OiBSZXN0YXVyYW50IERlbnNpdHksIEhpZ2ggRm9yZWlnbiBQb3B1bGF0aW9uXSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMkIucG5nKTwvY2VudGVyPgoKRnJvbSB0aGlzIGJhcmNoYXJ0LCBpdCB3b3VsZCBzZWVtIHRoYXQgaGlnaGVyIHRoYW4gYXZlcmFnZSBmb3JlaWduIHBvcHVsYXRlZCB6aXBjb2RlcyBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGEgaGlnaGVyIHJlc3RhdXJhbnQgZGVuc2l0eS4gT3ZlcmFsbCwgaXQgYXBwZWFycyB0aGF0IHJlc3RhdXJhbnQgZGVuc2l0eSBpcyBwcmV0dHkgZXZlbiBhY3Jvc3MgbGV2ZWxzIG9mIGZvcmVpZ24tYm9ybiBwb3B1bGF0aW9uIChpLmUuIHRoZXJlIGFyZSByZWxhdGl2ZWx5IHNpbWlsYXIgbnVtYmVycyBvZiBoaWdoIHJlc3RhdXJhbnQgZGVuc2l0eSB6aXBjb2RlcyBpbiBib3RoIGNhdGVnb3JpZXMpLiBUaGlzIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQgc3VnZ2VzdHMgdGhhdCByZXN0YXVyYW50IGRlbnNpdHkgbWF5IGJlIGZhaXJseSBpbmRlcGVuZGVudCBvZiBmb3JlaWduLSBvciBuYXRpdmUtYm9ybiBwb3B1bGF0aW9uIHN0YXR1cy4KCiMjIyMqU3RvcCB0byBSZXN0dWFyYW50IFJhdGlvcyBwZXIgWmlwY29kZSBieSBOYXRpdml0eSoKVGhpcyB2aXN1YWxpemF0aW9uIHNob3dzIHRoZSBwb3B1bGF0aW9ucyBvZiBOYXRpdmUsIE5hdHVyYWxpemVkLCBhbmQgTm9uLUNpdGl0emVuIGluaGFiaXRhbnRzIGZvciBlYWNoIHppcGNvZGUuIEZ1cnRoZXIsIHRoZXNlIGJhcmNoYXJ0cyBhcmUgY29sb3JlZCBieSB0aGUgcmVzdGF1cmFudCB0byBzdG9wIHJhdGlvIChkYXJrZXIgcHVycGxlIGluZGljYXRlcyBhIGhpZ2hlciByYXRpbykuIFRoZSBoaWdoZXN0IHJhdGlvcyBhcmUgYmV0d2VlbiA3ODcyMSBhbmQgNzg3MjQuIAoKPGNlbnRlcj4hW1RhYmxlYXU6IFN0b3BzIHRvIFJlc3RhdXJhbnRzIGJ5IE5hdGl2aXR5XSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMy5wbmcpPC9jZW50ZXI+CgpJbnRlcmVzdGluZ2x5LCB0aGUgcG9wdWxhdGlvbiBvZiBuYXRpdmUsIG5hdHVyYWxpemVkLCBhbmQgbm9uLWNpdGl6ZW4gcGVvcGxlcyBpcyBxdWl0ZSB2YXJpYWJsZSBhY3Jvc3MgemlwY29kZXMuIEFub3RoZXIgaW50ZXJlc3RpbmcgcG9pbnQgaXMgdGhhdCBmb3IgYWxsIHRocmVlIGNhdGVnb3JpZXMsIHRoZSBoaWdoZXN0IHJhdGlvcyBhcmUgbm90IGNvcnJlbGF0ZWQgd2l0aCB0aGUgaGlnaGVzdCBwb3B1bGF0aW9ucy4gVGhpcywgb2YgY291cnNlLCBzZWVtcyBub24taW50dWl0aXZlLCBhbmQgbWF5IGJlIGFuIGFyZWEgZm9yIGZ1dHVyZSBpbnF1aXJ5LgoKIyMqKlZpc3VhbGl6YXRpb25zIHVzaW5nIFNoaW55IGluIFIqKgpUaGUgc2NyZWVuc2hvdHMgYW5kIGRlc2NyaXB0aW9ucyBiZWxvdyBhcmUgYmFzZWQgb24gb3VyIGludGVyYWN0aXZlIHZpc3VhbGl6YXRpb24gYXBwLCBhY2Nlc3NpYmxlIGF0IGh0dHBzOi8va3ZhdWdobi5zaGlueWFwcHMuaW8vcmVzdGF1cmFudF9pbnNwZWN0aW9uLy4KCiMjIyoqQm94cGxvdCBWaXN1YWxpemF0aW9uIHVzaW5nIFNoaW55IGluIFIqKgpPbmUgbG93IHNjb3JlIGRvZXMgbm90IGluZGljYXRlIGEgc3lzdGVtaWMgcHJvYmxlbSB3aXRoIGEgcmVzdGF1cmFudCdzIGNsZWFubGluZXNzOyBiZWZvcmUganVkZ2luZyBhIHJlc3RhdXJhbnQgd2l0aCBhIGxvdyBzY29yZSwgaXQgYmVob292ZXMgdXMgdG8gY29uc2lkZXIgdGhlIG90aGVyIHNjb3JlcyBpdCBoYXMgcmVjZWl2ZWQuICBUaGlzIGJveHBsb3QgYWxsb3dzIHRoZSB1c2VyIHRvIGRvIGp1c3QgdGhhdC4gIEZpcnN0IHNlbGVjdCBhIGN1dG9vZiBwb2ludCBmb3Igc2NvcmVzLCB0aGVuIGNob29zZSBhIHppcGNvZGUgdG8gc2VlIGFsbCByZXN0YXVyYW50cyB0aGF0IGhhdmUgc2NvcmVkIGJlbG93IHRoYXQgbGV2ZWwgYXQgbGVhc3Qgb25lLiAgRWFjaCByZXN0YXVyYW50J3Mgc2NvcmVzIHdpbGwgZGlzcGxheSwgZ2l2aW5nIHRoZSB1c2VyIGFuIGlkZWEgb2Ygd2hldGhlciB0aGUgbG93IHNjb3JlIHdhcyBhIGZsdWtlIG9yIGEgc2lnbiBvZiBwcm9ibGVtcy4KCjxjZW50ZXI+IVtTaGlueTogU2NvcmVzIGJ5IFJlc3RhdXJhbnQgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JveEEucG5nKTwvY2VudGVyPiAKPGJyPiAKPGNlbnRlcj4hW1NoaW55OiBTY29yZXMgYnkgUmVzdGF1cmFudCBCb3hwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQm94Qi5wbmcpPC9jZW50ZXI+CgojIyMqKkhpc3RvZ3JhbSBWaXN1YWxpemF0aW9uIHVzaW5nIFNoaW55IGluIFIqKgpUaGlzIHZpc3VhbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIGdldCBhIGJyb2FkZXIgdmlldyBvZiB0aGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIHNjb3Jlcy4gIFRoZSB1c2VyIGlzIGdpdmVuIHRoZSBvcHRpb24gdG8gc2VsZWN0IHNjb3JlcyBmcm9tIGFueSBjb21iaW5hdGlvbiBvZiB5ZWFycy4gIFdoYXQncyBpbnRlcmVzdGluZyBoZXJlIGlzIHRoYXQgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcmVzdGF1cmFudCBpbnNwZWN0aW9ucyByZXN1bHQgaW4gInBhc3NpbmciIGdyYWRlcyBvZiA3MCBvciBoaWdoZXIuCgo8Y2VudGVyPiFbU2hpbnk6IEFsbCBTY29yZXMgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0hpc3RBLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBBbGwgU2NvcmVzIEhpc3RvZ3JhbV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0hpc3RCLnBuZyk8L2NlbnRlcj4KCiMjIyoqU2NhdHRlcnBsb3QgVmlzdWFsaXphdGlvbiB1c2luZyBTaGlueSBpbiBSKioKVGhlIFNjYXR0ZXJwbG90IHRhYiBpbmNsdWRlcyB0aHJlZSBzZXBhcmF0ZSB2aXN1YWxpemF0aW9ucyBkcmF3biBmcm9tIG9uZSBzZXQgb2YgZGF0YS4gIFRoZSBmaXJzdCB2aXN1YWxpemF0aW9uIHBsb3RzIHRoZSBwb3B1bGF0aW9uIG9mIGEgemlwY29kZSBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgaW4gdGhhdCB6aXBjb2RlLiAgVGhlIHNlY29uZCBncmFwaCBwbG90cyB0aGUgcG9wdWxhdGlvbiBwZXIgemlwY29kZSBhZ2FpbnN0IHRoZSBxdWFudGl0eSBvZiB0cmFuc2l0IHN0b3BzIGluIHRoYXQgemlwY29kZS4gIChUcmFuc2l0IHN0b3AgbG9jYXRpb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgQ2FwaXRhbCBNZXRybyBhbmQgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCBkYXRhLnRleGFzLmdvdjogaHR0cHM6Ly9kYXRhLnRleGFzLmdvdi9kYXRhc2V0L0dURlMvcjR2NC12ejI0ICkgIEFzIHlvdSBzZWUsIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwb3B1bGF0aW9uIGFuZCByZXN0YXVyYW50IG9yIHRyYW5zaXR5LXN0b3AgcXVhbnRpdHkgYXJlIHByZXR0eSB3ZWFrLiAgVGhlIHRoaXJkIHZpc3VhbGl6YXRpb24gaW4gdGhpcyBzZXQgZ3JhcGhzIHRyYW5zaXQgc3RvcHMgYnkgcmVzdGF1cmFudHMsIGFuZCBzaG93cyBhIG11Y2ggc3Ryb25nZXIgY29ycmVsYXRpb24uICBTZWUgYWJvdmUgZm9yIGEgZGlzY3Vzc2lvbiBvZiBvbmUgcG9zc2libGUgZXhwbGFuYXRpb24gZm9yIHRoaXMgcGF0dGVybiBvZiByZWxhdGlvbnNoaXBzLgoKPGNlbnRlcj4hW1NoaW55OiBTY2F0dGVycGxvdCBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlckRhdGEucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgYnkgUG9wdWxhdGlvbiBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIxLnBuZyk8L2NlbnRlcj4KPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFRyYW5zaXQgYnkgUG9wdWxhdGlvbiBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIyLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBSZXN0YXVyYW50IGJ5IFRyYW5zaXQgU2NhdHRlcnBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NTY2F0dGVyMy5wbmcpPC9jZW50ZXI+CgojIyMqKkNyb3NzdGFiIFZpc3VhbGl6YXRpb25zIHVzaW5nIFNoaW55IGluIFIqKgpDbGljayBoZXJlIHRvIGJlIHRha2VuIHRvIG91ciBwdWJsaXNoZWQgU2hpbnkgYXBwOiBodHRwczovL2t2YXVnaG4uc2hpbnlhcHBzLmlvL3Jlc3RhdXJhbnRfaW5zcGVjdGlvbi8KCiMjIyMqU2FmZXR5IEluZGV4KgpUaGlzIHZpc3VhbGl6YXRpb24gc3RhcnRzIHdpdGggYSBzb21ld2hhdC1hcmJpdHJhcnkgS1BJLCB0aGUgIlNhZmV0eSBJbmRleCwiIHRoYXQgdGFrZXMgaW50byBhY2NvdW50IGJvdGggdGhlIGF2ZXJhZ2Ugc2NvcmUgYW5kIHRoZSBsb3dlc3QgaW5zcGVjdGlvbiBzY29yZSByZWNlaXZlZCBmb3IgYSBnaXZlbiB6aXAgY29kZSBpbiBhIGdpdmVuIHllYXIuICBBIGhpZ2ggU2FmZXR5IEluZGV4IGluZGljYXRlcyBib3RoIGEgaGlnaCBhdmVyYWdlIHNjb3JlIGFuZCBhIGhpZ2ggbWluaW11bSBzY29yZS4gIFNldCB0aGUgcGFyYW1ldGVycyBob3dldmVyIHlvdSBsaWtlICgzIGFuZCA4IGFyZSByZWFzb25hYmxlIGRlZmF1bHRzKSBhbmQgY2hlY2sgdGhlIGNyb3NzdGFiIHRvIHNlZSBlYWNoIHppcCBjb2RlJ3MgcmF0aW5ncyBvdmVyIHRoZSBmb3VyLXllYXIgcGVyaW9kLgoKPGNlbnRlcj4hW1NoaW55OiBTYWZldHkgSW5kZXggRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMUEucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFNhZmV0eSBJbmRleCBDcm9zc3RhYl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMUIucG5nKTwvY2VudGVyPgoKIyMjIypMb3dlc3QgSW5zcGVjdGlvbiBTY29yZXMqClRoaXMgdmlzdWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGFuIGFyYml0cmFyeSBjdXRvZmYgcG9pbnQgYXMgYW4gYWlkIGZvciBpZGVudGlmeWluZyBsb3cgaW5zcGVjdGlvbiBzY29yZXMuICBUaGUgZGVmYXVsdCB2YWx1ZSwgNzAsIGlzIHRoZSBjdXRvZmYgZm9yIHJlc3RhdXJhbnQgaW5zcGVjdGlvbnM7IGxvd2VyIHNjb3JlcyB3aWxsIHRyaWdnZXIgYSByZWluc3BlY3Rpb24uICBBZnRlciBzZWxlY3RpbmcgYSBwYXJhbWV0ZXIgdXNpbmcgdGhlIHNsaWRlciBhbmQgcmVxdWVzdGluZyBkYXRhLCB0aGUgdXNlciBjYW4gc2VsZWN0IHRoZSAiQ3Jvc3N0YWIiIHRhYiB0byBzZWUgd2hpY2ggemlwIGNvZGVzIGFuZCB5ZWFycyBoYWQgdW5hY2NlcHRhYmx5IGxvdyBpbnNwZWN0aW9uIHNjb3Jlcy4KCjxjZW50ZXI+IVtTaGlueTogTG93ZXN0IEluc3BlY3Rpb24gU2NvcmVzIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NDcm9zczJBLnBuZyk8L2NlbnRlcj4KPGJyPgo8Y2VudGVyPiFbU2hpbnk6IExvd2VzdCBJbnNwZWN0aW9uIFNjb3JlcyBDcm9zc3RhYl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMkIucG5nKTwvY2VudGVyPgoKIyMjIypQZW9wbGUgcGVyIFJlc3RhdXJhbnQqCkF1c3RpbiBpcyBhIGZhc3QtZ3Jvd2luZyBjaXR5LCBhbmQgb3VyIHJlc3RhdXJhbnQgc2NlbmUgaXMgY3VycmVudGx5IGJvb21pbmcgYXMgd2VsbC4gIFRoaXMgdmlzdWFsaXphdGlvbiBhbGxvd3MgYSB1c2VyIHRvIHNlZSB3aGVyZSB0aGUgZGVuc2l0eSBvZiByZXN0YXVyYW50cyBjb21wYXJlZCB0byBwb3B1bGF0aW9uIGlzIGhpZ2hlc3QuICBVc2luZyBhIHB1YmxpYyBwb3B1bGF0aW9uIGRhdGFzZXQgZ2VuZXJhdGVkIGJ5IHRoZSBVUyBDZW5zdXMsIHdlIGNhbiBmaW5kIHRoZSBudW1iZXIgb2YgcGVvcGxlIHBlciByZXN0YXVyYW50IGluIGEgZ2l2ZW4gemlwIGNvZGU7IGFzIG1vcmUgcmVzdGF1cmFudHMgYXJlIGFkZGVkIChvciBmYWlsKSwgdGhlIHBlb3BsZS1wZXItcmVzdGF1cmFudCBudW1iZXIgY2hhbmdlcy4gIFRoZSBkZWZhdWx0IHZhbHVlcyBoaWdobGlnaHQgdGhlIGRlbnNpdHkgb2YgcmVzdGF1cmFudHMgaW4gNzg3MDEsIHdoaWNoIGlzIGRvd250b3duIEF1c3Rpbi4KCjxjZW50ZXI+IVtTaGlueTogUGVvcGxlIHBlciBSZXN0YXVyYW50IERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NDcm9zczNBLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBQZW9wbGUgcGVyIFJlc3RhdXJhbnQgQ3Jvc3N0YWJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NDcm9zczNCLnBuZyk8L2NlbnRlcj4KCiMjIyoqQmFyY2hhcnQgVmlzdWFsaXphdGlvbnMgdXNpbmcgU2hpbnkgaW4gUioqClRoZXNlIHZpc3VhbGl6YXRpb25zIGFyZSBhbHNvIGFjY2Vzc2libGUgYXQgaHR0cHM6Ly9rdmF1Z2huLnNoaW55YXBwcy5pby9yZXN0YXVyYW50X2luc3BlY3Rpb24vCgojIyMjKlNjb3JlcyBieSBaaXAgQ29kZSoKQmFyY2hhcnRzIGNhbiBiZSBhIGdvb2Qgd2F5IHRvIHF1aWNrbHkgaWRlbnRpZnkgdHJlbmRzIHZpc3VhbGx5LiAgSW4gdGhpcyB2aXN1YWxpemF0aW9uLCB0aGUgdXNlciBjYW4gY3JlYXRlIGEgc2V0IG9mIHppcCBjb2RlcyBvZiBpbnRlcmVzdCwgdGhlbiBzZWUgZWFjaCB6aXBjb2RlJ3MgYXZlcmFnZSBzY29yZSBwZXIgeWVhciBvdmVyIHRoZSB0aHJlZSBvciBmb3VyIHllYXJzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YXNldC4KCjxjZW50ZXI+IVtTaGlueTogU2NvcmVzIGJ5IFppcCBDb2RlIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIxQS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogU2NvcmVzIGJ5IFppcCBDb2RlIEJhciBDaGFydF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjFCLnBuZyk8L2NlbnRlcj4KCiMjIyMqVHJhbnNpdCBzdG9wcyBhbmQgcmVzdGF1cmFudCBkZW5zaXR5KgpDYXBpdGFsIE1ldHJvLCB0aGUgQXVzdGluLWFyZWEgdHJhbnNpdCBzZXJ2aWNlLCBoYXMgbWFkZSBpdHMgZGF0YSBmcmVlbHkgYXZhaWxhYmxlIGZvciBwdWJsaWMgZG93bmxvYWQuICBCeSBpbXBvcnRpbmcgdGhpcyBkYXRhIGludG8gZ2VvZ3JhcGhpYyBpbmZvcm1hdGlvbiBzb2Z0d2FyZSAoQXJjR0lTKSBhbmQgb3ZlcmxheWluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdHJhbnNpdCBzdG9wcyBvbiBhIHNoYXBlZmlsZSBvZiByZWdpb25hbCB6aXAgY29kZXMsIHdlIHdlcmUgYWJsZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMgcGVyIHppcCBjb2RlLiAgSW4gdGhpcyBiYXIgY2hhcnQsIHdlJ3JlIGV4YW1pbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHJhbnNpdCBkZW5zaXR5IGFuZCByZXN0YXVyYW50IGRlbnNpdHkuICBVc2UgdGhlIHNsaWRlciB0byBzZWxlY3QgemlwIGNvZGVzIHdpdGggbW9yZSB0aGFuIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0cmFuc2l0IHN0b3BzLCB0aGVuIGNvbXBhcmUgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGVzZSB6aXAgY29kZXMgdG8gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIHBlciB6aXAgY29kZSB0aHJvdWdob3V0IHRoZSByZWdpb24uICBUaGUgYmx1ZSBsaW5lIGlzIHRoZSBjYWxjdWxhdGVkIGF2ZXJhZ2UgZm9yIGFsbCBvZiB0aGUgc2VsZWN0ZWQgemlwIGNvZGVzLCBhbmQgdGhlIHJlZCBpcyB0aGUgZ3JhbmQgYXZlcmFnZSBmb3IgYWxsIG9mIHRoZSB6aXBjb2RlcyBpbiB0aGUgR3JlYXRlciBBdXN0aW4gYXJlYS4KCjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBUcmFuc2l0IFN0b3BzIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIyQS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBUcmFuc2l0IFN0b3BzIEJhciBDaGFydF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjJCLnBuZyk8L2NlbnRlcj4KCiMjIyMqTm9ubmF0aXZlIHJlc2lkZW50cyBhbmQgcmVzdGF1cmFudCBkZW5zaXR5KgpXb3VsZCB3ZSBleHBlY3QgemlwIGNvZGVzIHdpdGggY29tcGFyYXRpdmVseSBsYXJnZSBudW1iZXJzIG9mIG5vbm5hdGl2ZSAobmF0dXJhbGl6ZWQtY2l0aXplbiBvciBub25jaXRpemVuKSByZXNpZGVudHMgdG8gaGF2ZSBtb3JlIG9yIGZld2VyIHJlc3RhdXJhbnRzLCBvbiBhdmVyYWdlLCB0aGFuIHppcCBjb2RlcyB3aXRoIGxvd2VyIHBlcmNlbnRhZ2VzIG9mIG5vbm5hdGl2ZSByZXNpZGVudHM/ICBUaGlzIGJhcmNoYXJ0IGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgYSBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2Ygbm9ubmF0aXZlIHJlc2lkZW50cyBwZXIgemlwIGNvZGUsIHRoZW4gc2hvd3MgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGF0IHppcCBjb2RlIGFuZCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgcGVyIHppcCBjb2RlIGZvciBhbGwgb2YgdGhlIHF1YWxpZnlpbmcgemlwIGNvZGVzLiAgVGhpcyBhdmVyYWdlIGNhbiBiZSBjb21wYXJlZCB0byB0aGUgZ3JhbmQgYXZlcmFnZSB0aHJvdWdob3V0IHRoZSBncmVhdGVyIEF1c3RpbiBhcmVhLCBzaG93biBpbiByZWQuCgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgRGVuc2l0eSBhbmQgTm9ubmF0aXZlIFJlc2lkZW50cyBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQmFyM0EucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgRGVuc2l0eSBhbmQgTm9ubmF0aXZlIFJlc2lkZW50cyBCYXIgQ2hhcnRdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIzQi5wbmcpPC9jZW50ZXI+Cg==
=======
<<<<<<< HEAD
LS0tCnRpdGxlOiAiQXVzdGluIFJlc3RhcmFudCBJbnNwZWN0aW9ucyIKYXV0aG9yOiAiPGNlbnRlcj48Yj5NYXJjdXMgTWFydGluZXogYW5kIEthdGUgVmF1Z2huPC9iPjwvY2VudGVyPiIKZGF0ZTogIjxjZW50ZXI+TWF5IDIsIDIwMTc8L2NlbnRlcj4iCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0Ci0tLQoKIyoqSW50cm9kdWN0aW9uKioKIEluIHRoaXMgcHJvamVjdCwgd2UncmUgZXhhbWluaW5nIGluc3BlY3Rpb24gc2NvcmVzIGZvciByZXN0YXVyYW50cyBpbiBhbmQgYXJvdW5kIEF1c3RpbiwgVGV4YXMsIGZyb20gMjAxNCB0aHJvdWdoIGVhcmx5IDIwMTcuICBTY29yZXMgYXJlIGRldGVybWluZWQgdGhyb3VnaCByb3V0aW5lIGluc3BlY3Rpb25zLCB1c3VhbGx5IGNvbmR1Y3RlZCB0d2ljZSBhIHllYXIuICBJZiBhIHNjb3JlIGxvd2VyIHRoYW4gNzAgaXMgcmVjb3JkZWQgaW4gYSB5ZWFybHkgaW5zcGVjdGlvbiwgdGhlIHJlc3RhdXJhbnQgd2lsbCBiZSBzdWJqZWN0ZWQgdG8gb25lIG9yIG1vcmUgZm9sbG93dXAgdmlzaXRzIHRvIGVuc3VyZSBhIHJldHVybiB0byBjb21wbGlhbmNlLiAgQWxsIG9mIG91ciByZXN0YXVyYW50IGluc3BlY3Rpb24gcmVjb3JkcyBpbmNsdWRlIGdlb2dyYXBoaWNhbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiB6aXAgY29kZXMsIGFsbG93aW5nIHRoZSB1c2Ugb2YgYWRkaXRpb25hbCBkYXRhc2V0cyB0byBmdXJ0aGVyIGV4cGxvcmUgdGhlIGRhdGEuICBWaXNpdCBodHRwczovL2RhdGEud29ybGQva3ZhdWdobi9zLTE3LWR2LXByb2plY3QtNiB0byBleHBsb3JlIG91ciBkYXRhc2V0cywgb3Igc2VlIGJlbG93IGZvciB0aGUgdmlzdWFsaXphdGlvbnMgd2UndmUgbWFkZSBvZiB0aGUgZGF0YS4KCiMjKipSIENvbmZpZ3VyYXRpb24qKgpCZWxvdyB3ZSBkaXNwbGF5IG91ciBzZXNzaW9uSW5mbygpLgoKYGBge3IgU2Vzc2lvbkluZm8sIGVjaG89RkFMU0V9IApzZXNzaW9uSW5mbyhwYWNrYWdlPU5VTEwpCmBgYAoKIyoqVGhlIERhdGEqKgpUaGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIGRhdGFzZXQgd2FzIHByb3ZpZGVkIHRocm91Z2ggdGhlIENpdHkgb2YgQXVzdGluJ3MgT3BlbiBEYXRhIFBvcnRhbCwgaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi8uICBUaGlzIGZyZWUgZG93bmxvYWQgaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlIGZvcm1hdHMgYXQgaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi9IZWFsdGgvUmVzdGF1cmFudC1JbnNwZWN0aW9uLVNjb3Jlcy91dGh3LWE3aWguICBGb3IgdGhpcyBwcm9qZWN0LCB3ZSBkb3dubG9hZGVkIGEgQ1NWIGZpbGUgYW5kIGNsZWFuZWQgaXQgdXNpbmcgdGhlIEV4dHJhY3QtVHJhbnNsYXRlLUxvYWQgcHJvY2VkdXJlIG91dGxpbmVkIGJlbG93LgoKIyoqRXh0cmFjdC1UcmFuc2xhdGUtTG9hZCAoRVRMKSoqClRoZSBkYXRhc2V0IHdlIHJlY2VpdmVkIG5lZWRlZCBzb21lIGNsZWFuaW5nLCBhcyBpdCB3YXMgdW5yZWFkYWJsZSB0byBUYWJsZWF1IGluIGl0cyBvcmlnaW5hbCBDU1YgZm9ybWF0dGluZy4gIFdlIHVzZWQgdGhlIEV4dHJhY3QtVHJhbnNsYXRlLUxvYWQgbWV0aG9kIGRpc2N1c3NlZCBpbiBjbGFzcywgYW5kIGJ1aWx0IGFuIFIgc2NyaXB0IGZvdW5kIGF0ICIuLi8wMSBEYXRhL0VUTFJlc3RhdXJhbnQuUiIgIFdlIGFsc28gY2xlYW5lZCB1cCB0aGUgam9pbiBxdWVyeSB1c2VkIGluIG91ciBUYWJsZWF1IHZpc3VhbGl6YXRpb25zOyBpdCBjYW4gYmUgZm91bmQgYXQgIi4uLzAxIERhdGEvRVRMUXVlcnkuUiIgIElmIHlvdSdkIGxpa2UgdG8gZm9sbG93IGFsb25nLCBoZXJlJ3MgaG93IHdlIHByb2Nlc3NlZCB0aGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIGRhdGE6CgojIypTdGVwLUJ5LVN0ZXAgSW5zdHJ1Y3Rpb25zKgoqKkZpcnN0LCBkb3dubG9hZCB0aGUgdW5jbGVhbmVkIENTVjogaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi9hcGkvdmlld3MvZWNtdi05eHhpL3Jvd3MuY3N2P2FjY2Vzc1R5cGU9RE9XTkxPQUQuIFByZXBlbmQgIlByZUVUTF8iIHRvIHRoZSBmaWxlIG5hbWUsIGFuZCBwdXQgaXQgaW4gYSBmb2xkZXIgY2FsbGVkIENTVnMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgcHJvamVjdCAoczE3ZHZwcm9qZWN0NS12YXVnaG4tY2FubmF0YS1tYXJ0aW5leikuKioKCiMjIypTdGVwIDE6IFNldCB1cCB0aGUgZW52aXJvbm1lbnQqCk5vdGUgdGhhdCB3ZSBoYXZlIG9uZSBjb2x1bW4gb2YgbnVtZXJpYyBkYXRhICgiU2NvcmUiKSwgb25lIGNvbHVtbiBvZiBkYXRlcyAoIkluc3BlY3Rpb24gRGF0ZSIpLCB0aHJlZSBjb2x1bW5zIG9mIHN0cmluZ3MgKCJSZXN0YXVyYW50IE5hbWUiLCAiQWRkcmVzcyIsIGFuZCAiUHJvY2VzcyBEZXNjcmlwdGlvbiIpLCBhbmQgdHdvIGNvbHVtbnMgb2YgbnVtZXJpYyBkYXRhIHVzZWQgY2F0ZWdvcmljYWxseSAoIlppcCBDb2RlIiBhbmQgIkZhY2lsaXR5IElEIikuICBGb3IgdGhlIHNha2Ugb2YgZWFzZSBvZiB1c2UsIHRoZXNlIGxhc3QgdHdvIGNvbHVtbnMgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MuCmBgYHtyIGV0bDF9CiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCJ+L3MxN2R2ZmluYWxwcm9qZWN0LXZhdWdobi1jYW5uYXRhLW1hcnRpbmV6LTEvMDAgRG9jcyIpCgojIFNldCBmaWxlcGF0aApmaWxlX3BhdGggPSAiLi4vLi4vQ1NWcy9QcmVFVExfUmVzdGF1cmFudF9JbnNwZWN0aW9uX1Njb3Jlcy5jc3YiCgojIENyZWF0ZSBkYXRhZnJhbWUgZnJvbSBvcmlnaW5hbCBDU1YKZGYgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIFN0YW5kYXJkaXplIGNvbHVtbiBuYW1lcwpuYW1lcyhkZikgPC0gZ3N1YigiXFwuKyIsICIgIiwgbmFtZXMoZGYpKQoKIyBQcmludCBjb2x1bW4gbmFtZXMgYW5kIHR5cGVzCnN0cihkZikKYGBgCgojIyMqU3RlcCAyOiBDb2xsZWN0IGNvbHVtbnMgYnkgdHlwZSoKV2UndmUgZ3JvdXBlZCB0aGUgZGF0ZSBjb2x1bW4gc2VwYXJhdGVseSBmcm9tIG1lYXN1cmVzIGFuZCBkaW1lbnNpb25zOyB3aGlsZSBUYWJsZWF1IHdpbGwgcmVjb2duaXplIHRoZXNlIGRhdGEgYXMgZGF0ZXMsIGl0IHNlZW1zIHBydWRlbnQgdG8gcmVjbGFzc2lmeSB0aGVtIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LgpgYGB7ciBldGwyfQojIFNlbGVjdCBzdHJpbmcgZGF0YSBhcyAnZGltZW5zaW9ucycKZGltZW5zaW9ucyA8LSBjKCJSZXN0YXVyYW50IE5hbWUiLCAiWmlwIENvZGUiLCAiQWRkcmVzcyIsICJQcm9jZXNzIERlc2NyaXB0aW9uIiwgIkZhY2lsaXR5IElEIikKCiMgU2VsZWN0IGRhdGVzIGFzICdkYXRlcycKZGF0ZXMgPC0gYygiSW5zcGVjdGlvbiBEYXRlIikKCiMgU2VsZWN0IGFsbCByZW1haW5pbmcgZGF0YSBhcyAnbWVhc3VyZXMnCm1lYXN1cmVzIDwtIHNldGRpZmYobmFtZXMoZGYpLCB1bmlvbihkaW1lbnNpb25zLCBkYXRlcykpCgpgYGAKCiMjIypTdGVwIDM6IFJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMqCkhlcmUgd2UgcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIGFsbCBvZiBvdXIgZGF0YS4gIFRoZXNlIGNoYXJhY3RlcnMgY2FuIHNlcnZlIG5vIHB1cnBvc2UgaW4gdGhlIGRhdGEsIGFuZCBtaWdodCBjYXVzZSBwcm9ibGVtcyBpbiB0aGUgYW5hbHlzaXMgcHJvY2Vzcy4gIFRvIGltcHJvdmUgcmVhZGFiaWxpdHksIHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgc3BhY2VzLgpgYGB7ciBldGwzfQojIEdldCByaWQgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGVhY2ggY29sdW1uLgpmb3IobiBpbiBuYW1lcyhkZikpIHsKICBkZltuXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltuXSwgZ3N1YiwgcGF0dGVybj0iW14gLX5dIixyZXBsYWNlbWVudD0gIiAiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp9CmBgYAoKIyMjKlN0ZXAgNDogTW9kaWZ5IHJlY29yZHMgaW4gZGltZW5zaW9ucyoKTm93IHdlIGdvIHRocm91Z2ggYWxsIG9mIHRoZSBjaGFyYWN0ZXItYmFzZWQgY29sdW1ucyAoZ3JvdXBlZCBhcyBkaW1lbnNpb25zKSBhbmQgcmVtb3ZlIHRyb3VibGVzb21lIGNoYXJhY3RlcnMuICBBbXBlcnNhbmRzIGFyZSByZXBsYWNlZCB3aXRoICJhbmQiLCBzZW1pY29sb25zIGFyZSByZXBsYWNlZCB3aXRoIGNvbG9ucywgYW5kIHNpbmdsZS0gYW5kIGRvdWJsZS1xdW90ZXMgYXJlIHJlbW92ZWQgb3V0cmlnaHQuICBEYXRhIG9mIE5BIChudWxsKSBpcyByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KYGBge3IgZXRsNH0KIyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSBOQSBkYXRhIHdpdGggYW4gZW1wdHkgc3RyaW5nCm5hMmVtcHR5U3RyaW5nIDwtIGZ1bmN0aW9uICh4KSB7CiAgeFtpcy5uYSh4KV0gPC0gIiIKICByZXR1cm4oeCkKfQojIFdlJ2xsIGFwcGx5IHRoaXMgdG8gYWxsIGNvbHVtbnMgZ3JvdXBlZCBhcyBkaW1lbnNpb25zCmlmKCBsZW5ndGgoZGltZW5zaW9ucykgPiAwKSB7CiAgZm9yKGQgaW4gZGltZW5zaW9ucykgewogICAgIyBDaGFuZ2UgTkEgdG8gdGhlIGVtcHR5IHN0cmluZy4KICAgIGRmW2RdIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW2RdLCBuYTJlbXB0eVN0cmluZyksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICMgR2V0IHJpZCBvZiAiIGFuZCAnIGluIGRpbWVuc2lvbnMuCiAgICBkZltkXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltkXSwgZ3N1YiwgcGF0dGVybj0iW1wiJ10iLHJlcGxhY2VtZW50PSAiIiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICMgQ2hhbmdlICYgdG8gYW5kIGluIGRpbWVuc2lvbnMuCiAgICBkZltkXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltkXSwgZ3N1YiwgcGF0dGVybj0iJiIscmVwbGFjZW1lbnQ9ICIgYW5kICIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAjIENoYW5nZSA6IHRvIDsgaW4gZGltZW5zaW9ucy4KICAgIGRmW2RdIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW2RdLCBnc3ViLCBwYXR0ZXJuPSI6IixyZXBsYWNlbWVudD0gIjsiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIH0KfQoKYGBgCgojIyMqU3RlcCA1OiBNb2RpZnkgZGF0ZXMqCkhlcmUgd2UgZW5zdXJlIHRoYXQgZGF0ZXMgYXJlIGZvcm1hdHRlZCBjb3JyZWN0bHkuCmBgYHtyIGV0bDV9CmlmKCBsZW5ndGgoZGF0ZXMpID4gMSB8fCAhIGlzLm5hKGRhdGVzKSkgewogIGZvcih5IGluIGRhdGVzKSB7CiAgICAjIEZvcm1hdCBhcyBkYXRlcwogICAgZGZbeV0gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZbeV0sIGZ1bmN0aW9uKHkpIGFzLkRhdGUoeSwgZm9ybWF0ID0gIiVtLyVkLyV5IikpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgfQp9CmBgYAoKIyMjKlN0ZXAgNjogTW9kaWZ5IG1lYXN1cmVzKgpOb3cgd2UgdGFrZSBhbGwgb2YgdGhlIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgb3V0IG9mIG91ciBtZWFzdXJlcy4KYGBge3IgZXRsNn0KbmEyemVybyA8LSBmdW5jdGlvbiAoeCkgewogIHhbaXMubmEoeCldIDwtIDAKICByZXR1cm4oeCkKfQojIEdldCByaWQgb2YgYWxsIGNoYXJhY3RlcnMgaW4gbWVhc3VyZXMgZXhjZXB0IGZvciBudW1iZXJzLCB0aGUgLSBzaWduLCBhbmQgcGVyaW9kLmRpbWVuc2lvbnMsIGFuZCBjaGFuZ2UgTkEgdG8gMC4KaWYobGVuZ3RoKG1lYXN1cmVzKSA+IDEgfHwgISBpcy5uYShtZWFzdXJlcykpIHsKICBmb3IobSBpbiBtZWFzdXJlcykgewogICAgZGZbbV0gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZbbV0sIGdzdWIsIHBhdHRlcm49IlteLS0uMC05XSIscmVwbGFjZW1lbnQ9IiIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICBkZlttXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZlttXSwgbmEyemVybyksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgIGRmW21dIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW21dLCBmdW5jdGlvbihtKSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihtKSkpKSAjIFRoaXMgaXMgbmVlZGVkIHRvIHR1cm4gbWVhc3VyZXMgYmFjayB0byBudW1lcmljIGJlY2F1c2UgZ3N1YiB0dXJucyB0aGVtIGludG8gc3RyaW5ncy4KICB9Cn0KYGBgCgojIyMqU3RlcCA3OiBEdW1teSBjaGVjayoKQWx3YXlzIGEgdXNlZnVsIHRoaW5nLiAgTGV0J3MgbG9vayBhdCBvdXIgZGF0YSBhbmQgc2VlIHdoYXQgd2UndmUgZ290LiAgV2UncmUgZXhwZWN0aW5nIGFsbCBkYXRhIHRvIGJlIGluIGNoYXJhY3RlciBmb3JtIGV4Y2VwdCAiU2NvcmUiLCB3aGljaCB3aWxsIGJlIG51bWVyaWMsIGFuZCBvdXIgZGF0ZSBjb2x1bW4gbmFtZWQgIkluc3BlY3Rpb24gRGF0ZSIuCmBgYHtyIGV0bDd9CiMgVGFrZSBhIGxvb2sgYW5kIG1ha2Ugc3VyZSBpdCdzIHdoYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZToKcHJpbnQoc3VtbWFyeShkZikpCmBgYAoKIyMjKlN0ZXAgODogV3JpdGUgdG8gYSBuZXcgZmlsZSoKT3VyIGRhdGEgbG9va3MgZ29vZCwgYW5kIHdlIG5lZWQgdG8gd3JpdGUgaXQgdG8gYSBuZXcgZmlsZS4KYGBge3IgZXRsOH0KIyBOb3cgd3JpdGUgaXQgdG8gYSBuZXcgY2xlYW4gZmlsZS4Kd3JpdGUuY3N2KGRmLCBnc3ViKCJQcmVFVExfIiwgIiIsIGZpbGVfcGF0aCksIHJvdy5uYW1lcz1GQUxTRSwgbmEgPSAiIikKYGBgCgojKipWaXN1YWxpemF0aW9ucyoqCgojIyoqSW50ZXJlc3RpbmcgVGhpbmdzKioKIyMjKipDaGluYXRvd24uKiogIApHZW5lcmFsbHkgc3BlYWtpbmcsIGxvdyBzY29yZXMgYXJlIG91dGxpZXJzIGZvciByZXN0YXVyYW50cy4gIFRoZSBpbnNwZWN0b3IgY2F1Z2h0IHRoZW0gb24gYSBiYWQgZGF5LCBwZXJoYXBzLiAgTG9vayBhdCB0aGUgaGlzdG9ncmFtIGZvciBhbiBpbmRpY2F0aW9uIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHBhc3Npbmcgc2NvcmVzIChhYm92ZSA3MCkgdmVyc3VzIGZhaWxpbmcgc2NvcmVzLiAgCjxjZW50ZXI+IVtBbGwgU2NvcmVzIEhpc3RvZ3JhbV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0hpc3RCLnBuZyk8L2NlbnRlcj4KSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gc2VlaW5nIHRoZSB3aG9sZSBjb2xsZWN0aW9uIG9mIHNjb3JlcyBmb3IgYSByZXN0YXVyYW50IHdpdGggYXQgbGVhc3Qgb25lIGxvdyBzY29yZSwgdXNlIHRoZSBib3hwbG90IGFuZCBzZWxlY3QgdGhlIHppcGNvZGUgb2YgaW50ZXJlc3QuICBTb21lIHJlc3RhdXJhbnRzIGRlbW9uc3RyYXRlIGEgdHJlbmQgaW4gdGhlaXIgbG93IHNjb3JlcyB0aGF0IGdvZXMgYmV5b25kICJvbmUgYmFkIGRheSIuICBDaGluYXRvd24sIGluIDc4NzMxLCBpcyBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzLiAgQSBzY29yZSBvZiA3MCBvciBoaWdoZXIgaXMgY29uc2lkZXJlZCAncGFzc2luZywnIHdoaWxlIGEgc2NvcmUgYmVsb3cgNzAgdHJpZ2dlcnMgYW4gYXV0b21hdGljIHJlaW5zcGVjdGlvbiBvZiB0aGUgZmFjaWxpdHkuICBSZXN0YXVyYW50cyBhcmUgZW5jb3VyYWdlZCB0byBhaW0gZm9yIHNjb3JlcyBhcHByb2FjaGluZyAxMDAuICBDaGluYXRvd24gaXMgYXBwYXJlbnRseSBqdXN0IGFpbWluZyB0byBwYXNzLiAgV2l0aCBhbiBhdmVyYWdlIHNjb3JlIG9mIDcxLCBpdCdzIG1lZXRpbmcgaXRzIGdvYWwuCjxjZW50ZXI+IVtDaGluYXRvd24ncyBBdmVyYWdlIFNjb3JlXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQm94Qi5wbmcpPC9jZW50ZXI+Cjxicj4KCiMjIyoqVGhlIGxpbWl0YXRpb25zIG9mIG91ciBkYXRhc2V0LioqIApXZSBvcmlnaW5hbGx5IGV4cGVjdGVkIHN0cm9uZyBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIGEgZ2l2ZW4gemlwIGNvZGUgYW5kIHRoZSBwb3B1bGF0aW9uIG9mIHRoYXQgemlwIGNvZGUsIHdpdGggYW4gZXhwZWN0YXRpb24gdGhhdCBkb3dudG93biB3b3VsZCBiZSBhbiBvdXRsaWVyIChsb3RzIG9mIHJlc3RhdXJhbnRzLCByZWxhdGl2ZWx5IGZldyByZXNpZGVudHMpLiAgV2hlbiB3ZSBncmFwaGVkIG91ciBkYXRhLCB3ZSBmb3VuZCB0aGF0IHJlc3RhdXJhbnQgcXVhbnRpdHkgYW5kIHBvcHVsYXRpb24gd2VyZSBvbmx5IHdlYWtseSBjb3JyZWxhdGVkLCBhbmQgd2UgZm91bmQgYSBudW1iZXIgb2YgdW5leHBlY3RlZCBvdXRsaWVycy4gIAo8Y2VudGVyPiFbUmVzdGF1cmFudCBieSBQb3B1bGF0aW9uIFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjEucG5nKTwvY2VudGVyPgpTaW1pbGFybHksIHdlIGV4cGVjdGVkIHRoYXQgdGhlIG51bWJlciBvZiB0cmFuc2l0IHN0b3BzIHdvdWxkIGJlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIGEgZ2l2ZW4gemlwY29kZS4gIFRoaXMgdGltZSwgb3VyIGRhdGEgc3VwcG9ydGVkIG91ciBleHBlY3RhdGlvbnMsIHdpdGggYSBtb2RlcmF0ZWx5IHN0cm9uZyBjb3JyZWxhdGlvbiBvZiAwLjc1Ni4gIAo8Y2VudGVyPiFbUmVzdGF1cmFudCBieSBUcmFuc2l0IFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjMucG5nKTwvY2VudGVyPgpDdXJpb3NpdHkgdGhlbiBsZWQgdXMgdG8gcGxvdCBwb3B1bGF0aW9uIHZlcnN1cyBudW1iZXIgb2YgdHJhbnNpdCBzdG9wcyBmb3IgYSBnaXZlbiB6aXBjb2RlOyBhZ2FpbiwgdGhlIHR3byB3ZXJlIG9ubHkgd2Vha2x5IGNvcnJlbGF0ZWQsIHdpdGggbWFueSBvZiB0aGUgc2FtZSBvdXRsaWVycy4gIAo8Y2VudGVyPiFbVHJhbnNpdCBieSBQb3B1bGF0aW9uIFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjIucG5nKTwvY2VudGVyPiAKVGhpcyBwcm9tcHRlZCBhIGNsb3NlciBsb29rIGF0IHRob3NlIG91dGxpZXJzLCBhbmQgZGVtb25zdHJhdGVkIGEgc2hvcnRjb21pbmcgaW4gb3VyIGRhdGFzZXQuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgb3V0bGllcnMgd2l0aCBsYXJnZSBwb3B1bGF0aW9ucyBhbmQgZmV3IHRyYW5zaXQgc3RvcHMgb3IgcmVzdGF1cmFudHMgYXJlIGluIHRoZSBmYXIgc3VidXJicyBvZiBBdXN0aW4uICBUaGVzZSBhcmVhcyBhcmUgZ292ZXJuZWQgYnkgb3RoZXIgY2l2aWMgYm9kaWVzLCBhbmQgdGh1cyB0aGUgYnVsayBvZiB0aGVpciByZXN0YXVyYW50IGluc3BlY3Rpb25zIChhbmQsIHBvdGVudGlhbGx5LCB0cmFuc2l0KSB3aWxsIGJlIGNvbmR1Y3RlZCBieSBhbiBlbnRpdHkgb3RoZXIgdGhhbiB0aGUgQ2l0eSBvZiBBdXN0aW4uICBJbiBvcmRlciB0byBnZXQgYSBjbGVhbmVyIHZpZXcgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcHVsYXRpb24sIHRyYW5zaXQsIGFuZCByZXN0YXVyYW50IGRlbnNpdHksIHdlIHdvdWxkIG5lZWQgdG8gYWRqdXN0IG91ciBkYXRhIHRvIG9ubHkgaW5jbHVkZSBhcmVhcyB1bmRlciB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBDaXR5IG9mIEF1c3Rpbi4gCkEgZ29vZCB2aXN1YWxpemF0aW9uIG9mIHRoaXMgZGlzdHJpYnV0aW9uIGNhbiBiZSBzZWVuIGJlbG93Lgo8Y2VudGVyPiFbRGF0YXNldCBMaW1pdGF0aW9ucyBNYXBdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCT3V0bGllck1hcC5wbmcpPC9jZW50ZXI+Cjxicj4KCiMjIyoqUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBOb24tbmF0aXZlIFBvcHVsYXRpb24qKgoKCiMjKipWaXN1YWxpemF0aW9ucyB1c2luZyBUYWJsZWF1KioKCiMjIyoqQm94cGxvdCB1c2luZyBUYWJsZWF1KioKCjxjZW50ZXI+IVtUYWJsZWF1OiBTY29yZXMgQmVsb3cgQ3V0b2ZmIEJveHBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCb3hwbG90LnBuZyk8L2NlbnRlcj4KCiMjIyoqUmF3IFNjb3Jlcy0gSGlzdG9ncmFtKioKQXMgY2FuIGJlIHNlZW4gaW4gdGhlIHZpc3VhbGl6YXRpb24gYmVsb3csIHRoZSBtb3N0IGNvbW1vbiByYXcgcmVzdGF1cmFudCBpbnNwZWN0aW9uIHNjb3JlIGlzIGJldHdlZW4gOTAgYW5kIDEwMC4gVGhlIDkwLTk1IGFuZCA5NS0xMDAgYmlucyBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUuIFRoZSBzZWNvbmQgbW9zdCBjb21tb24gcmFuZ2VzIGFyZSA4NS05MCBhbmQgMTAwLTEwNS4gVGhlc2UgYXJlIGFsc28gdGhlIHNhbWUgc2l6ZSwgYnV0IGEgbGl0dGxlIG92ZXIgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgbW9zdCBjb21tb24gc2NvcmUgcmFuZ2UuIAoKPGNlbnRlcj4hW1RhYmxlYXU6IFJhdyBTY29yZSBIaXN0b2dyYW1dKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RIaXN0LnBuZyk8L2NlbnRlcj4KClRoZSBuZXh0IGxhcmdlc3QgYmluIGlzIGhhbGYgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBsYXJnZXN0LCBhbmQgdGhpcyBwYXR0ZXJuIGNvbnRpbnVlcyB1bnRpbCB3ZSBkcm9wIGJlbG93IDcwLiBUaGlzIGlzIHBhcnRpY3VsYXJseSBnb29kIG5ld3MsIGFzIGl0IGltcGxpZXMgdGhhdCBmYWlsaW5nIHNjb3JlcyAodGhvc2UgYmVsb3cgNzApIGFyZSBub3QgdmVyeSBjb21tb24gYXQgYWxsLCBhbmQgZnVydGhlcm1vcmUgdGhhdCBleGNlcHRpb25hbCBzY29yZXMgYXJlIGhpZ2hseSBjb21tb24uCgojIyMqKkNhcE1ldHJvIFN0b3BzIGFuZCBSZXN0YXVyYW50IERlbnNpdHkgYXMgdGhleSBSZWxhdGUgdG8gUG9wdWxhdGlvbi0gU2NhdHRlcnBsb3QqKgpIZXJlIHdlIHNlZSBhIGNvbXByZWhlbnNpdmUgdmlzdWFsaXphdGlvbiB0aGF0IHJlZmxlY3RzIGRhdGEgYXMgd2UndmUgc2VlbiBpdCBiZWZvcmUsIGluIG91ciAiaW50ZXJlc3RpbmcgdGhpbmdzIiBzZWN0aW9uLiBUaGlzIHNjYXR0ZXJwbG90IHNob3dzIHJlc3RhdXJhbnQgYW5kIHN0b3AgZGVuc2l0eSBwZXIgemlwY29kZS4gRWFjaCBwb2ludCBpcyBzaXplZCBieSB0aGUgcG9wdWxhdGlvbiBvZiB0aGF0IHppcGNvZGUuIFVsdGltYXRlbHksIHdlIHNlZSBhbiBvdmVyYWxsIHBvc2l0aXZlIHRyZW5kLiBIb3dldmVyLCB1cG9uIGNsb3NlciBleGFtaW5hdGlvbiwgaXQgaXMgY2xlYXIgdGhhdCBtYW55IGhpZ2ggcG9wdWxhdGlvbiB6aXBjb2RlcyBoYXZlIGEgbG93ZXIgcmVzdGF1cmFudCBhbmQgc3RvcCBkZW5zaXR5LiAKCjxjZW50ZXI+IVtUYWJsZWF1OiBSZXN0YXVyYW50IGFuZCBTdG9wIERlbnNpdHkgU2NhdHRlcnBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCU2NhdHRlcnBsb3QucG5nKTwvY2VudGVyPgoKVGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGhhdmUgYWxyZWFkeSBiZWVuIGRpc2N1c3NlZCBpbiBwcmV2aW91cyBzZWN0aW9ucy4gSG93ZXZlciwgaXQgaXMgYWxzbyBpbnRlcmVzdGluZyB0byBub3RlIHRoYXQgbWFueSB6aXBjb2RlcyAocmVnYXJkbGVzcyBvZiBwb3B1bGF0aW9uIHNpemUpLCBhcmUgZ3JvdXBlZCB0b3dhcmRzIHRoZSBsb3dlciB0byBtZWRpdW0gcmVzdGF1cmFudCBhbmQgc3RvcCBkZW5zaXR5IGFyZWEuIEluIGZhY3QsIHRoZSBmdXJ0aGVyIG91dCBpbiBlaXRoZXIgZGlyZWN0aW9uIHlvdSBnbywgdGhlIGxlc3MgaW5zdGFuY2VzIHRoZXJlIGFyZS4gVGhpcyBsaWtlbHkgc2hvd3MgdGhhdCB3aGlsZSB0aGVyZSBpcyBhIHNsaWdodCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHN0b3AgYW5kIHJlc3RhdXJhbnQgZGVuc2l0eSwgbW9zdCBhcmVhcyBhcmUgbm90IGxpa2VseSB0byBoYXZlIGFuIGV4Y2VwdGlvbmFsIG51bWJlciBvZiBlaWh0ZXIuIAoKIyMjKipDcm9zc3RhYi1yZWxhdGVkIFZpc3VhbGl6YXRpb25zIHVzaW5nIFRhYmxlYXUqKgpCZWxvdyB5b3Ugd2lsbCBmaW5kIHRoZSB2aXN1YWxpemF0aW9ucyB3ZSBjcmVhdGVkIHVzaW5nIFRhYmxlYXUuIEVhY2ggdmlzdWFsaXphdGlvbiBpcyBvbmx5IGEgZnJhY3Rpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHZpZXdlZCBpbiBUYWJsZWF1LCBhcyB0aGVzZSBjcm9zc3RhYnMgY2Fubm90IHNob3djYXNlIGFsbCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGF0IG9uY2UuICBPdXIgVGFibGVhdSB3b3JrYm9vayBpcyBpbmNsdWRlZCBpbiBvdXIgcmVwb3NpdG9yeSBpbiB0aGUgZm9sZGVyIDAxIERhdGEuCgojIyMjKkluc3BlY3Rpb24gU2NvcmVzLCBBcmVhLCBhbmQgSW5jb21lKgpUaGlzIGNyb3NzdGFiIHNob3dzIGJ5IHllYXIgYW5kIHppcGNvZGUgKGluIEF1c3RpbiksIHRoZSBhdmVyYWdlIHJlc3RhdXJhbnQgaW5zcGVjdGlvbiBzY29yZS4gVGhlIGNyb3NzdGFiIGlzIGNvbG9yZWQgYnkgdGhlIHBlcmNlbnRhZ2Ugb2YgaG91c2Vob2xkcyBpbiBlYWNoIGFyZWEgdW5kZXIgdGhlIG5hdGlvbmFsIHBvdmVydHkgbGluZSAocHVsbGVkIGZyb20gVVMgQ2Vuc3VzIGRhdGEpLiBBcyBpcyBldmlkZW50LCBhdmVyYWdlIHNjb3JlcyByZW1haW4gcmVsYXRpdmVseSBoaWdoIGFjcm9zcyBwb3ZlcnR5IGxldmVscyBhbmQgemlwY29kZXMuIEluIFRhYmxlYXUgeW91IGFyZSBhYmxlIHRvIGN5Y2xlIHRocm91Z2ggemlwY29kZXMgaW4gdGhlIHdlc3Rlcm4gb3IgZWFzdGVybiBoYWxmIG9mIHRoZSBncmVhdGVyIEF1c3RpbiBhcmVhLiBFdmVuIGF0IHRoaXMgbGV2ZWwsIGF2ZXJhZ2Ugc2NvcmVzIHJlbWFpbiBzaW1pbGFyLiBUaGVyZSBhcmUgbW9yZSBhdmVyYWdlIHNjb3JlcyBiZWxvdyA5MCBpbiB0aGUgZWFzdGVybiBzZWN0aW9uLCBidXQgdGhpcyBpcyBsaWtlbHkgbm90IHNpZ25pZmljYW50LgoKPGNlbnRlcj4hW1RhYmxlYXU6IFNjb3JlcyBieSBJbmNvbWUgYW5kIEFyZWFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL0Nyb3NzdGFiQXZlcmFnZVNjb3JlYnlQb3ZlcnR5TGV2ZWwucG5nKTwvY2VudGVyPgoKSXQgaXMgcG9zc2libGUgdGhpcyBpcyB1bmlxdWUgdG8gQXVzdGluLCBhbmQgbWF5IGJlIGEgY29uc2VxdWVuY2Ugb2Ygc3RyaW5nZW50IGZvb2Qgc2FmZXR5IGNvZGUgaW4gdGhlc2UgYXJlYXMuIEZ1cnRoZXIgYW5hbHlzaXMgd291bGQgbmVlZCB0byBiZSBkb25lIHRvIHNlZSBpZiB0aGVzZSBjb3JyZWxhdGlvbnMgYXJlIHRydWUgZWxzZXdoZXJlIGluIHRoZSBVbml0ZWQgU3RhdGVzLgoKIyMjIypBdmVyYWdlIEluc3BlY3Rpb24gU2NvcmVzIEdlb2dyYXBoaWNhbGx5KgpBcyBjYW4gYmUgc2VlbiwgdGhpcyB2aXN1YWxpemF0aW9uIGRpc3BsYXlzIHRoZSBhdmVyYWdlIGluc3BlY3Rpb25zIHNjb3JlIGZvciBlYWNoIHppcGNvZGUgYXJlYS4gRWFjaCB6aXBjb2RlJ3MgY29sb3IgaXMgZGV0ZXJtaW5lZCBieSBpdHMgYXZlcmFnZSBpbnNwZWN0aW9uIHNjb3JlJ3MgcHJveGltaXR5IHRvIHRoZSBncmFuZCBhdmVyYWdlIGZvciB0aGUgeWVhcihzKSBzZWxlY3RlZCBpbiB0aGUgZmlsdGVyLiAgVGhpcyBpcyBkb25lIHVzaW5nIGEgY2FsY3VsYXRlZCBmaWVsZCwgYW5kIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGFjY29yZGluZyB0aGUgdGhlIGRhdGEgc2VsZWN0ZWQgaW4gdGhlIFllYXIgZmlsdGVyLiAgSWYgYXJyaXZpbmcgYXQgdGhpcyBtYXAgYnkgY2xpY2tpbmcgb24gZWl0aGVyIG9mIHRoZSBjcm9zc3RhYnMsIHRoZSB6aXAgY29kZXMgd2lsbCBkaXNwbGF5IHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIGdyYW5kIGF2ZXJhZ2Ugb2YgdGhlIHNlbGVjdGVkIHllYXIuCgo8Y2VudGVyPiFbVGFibGVhdTogTWFwIG9mIEF2ZXJhZ2UgSW5zcGVjdGlvbiBTY29yZXNdKC4uLzAzIFZpc3VhbGl6YXRpb25zL0Nyb3NzdGFiSW5zcGVjdGlvblNjb3JlTWFwLnBuZyk8L2NlbnRlcj4KCkl0IGlzIGFnYWluIGV2aWRlbnQgdGhhdCBhdmVyYWdlIHNjb3JlcyBhcmUgcmVsYXRpdmVseSBoaWdoIGFjcm9zcyBlYWNoIGFyZWEuIAoKIyMjIypBdmVyYWdlIFNjb3JlIGJ5IFllYXIqClRoaXMgaGlnaGx5IGNvbXByZWhlbnNpdmUgdmlzdWFsaXphdGlvbiBzaG93cyB1cyB0aHJlZSBtYWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogYXZlcmFnZSBzY29yZSwgbWluaW11bSBzY29yZSwgYW5kIHNhZmV0eSBpbmRleC4gQXMgaGFzIGJlZW4gcHJldmlvdXNseSBub3RlZCwgYXZlcmFnZSBzY29yZXMgYXJlIHJlbGF0aXZlbHkgaGlnaCBpbiBlYWNoIHppcGNvZGUuIE1pbnVtdW0gc2NvcmVzIGNhbiBiZSBxdWl0ZSBsb3cgKG9uZSBvZiB0aGUgbG93ZXN0IHNjb3JlcyBpcyAzNiksIGJ1dCB0aGVzZSBhcmUgZmV3IGFuZCBmYXIgYmV0d2Vlbi4KCjxjZW50ZXI+IVtUYWJsZWF1OiBBdmVyYWdlIFNjb3JlIGJ5IFllYXJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL0Nyb3NzdGFiU2NvcmVzYnlZZWFyLnBuZyk8L2NlbnRlcj4KClRoaXMgY3Jvc3N0YWIgaXMgYWxzbyBjb2xvcmVkIGJ5IGEgU2FmZXR5IEluZGV4LiAgVGhpcyBLUEkgaXMgYmFzZWQgaW4gYSBjYWxjdWxhdGVkIGZpZWxkIHRoYXQgYWNjb3VudHMgZm9yIHRoZSBhdmVyYWdlIHNjb3JlIGFuZCBtaW5pbXVtIHNjb3JlIGZvciBhIGdpdmVuIHppcCBjb2RlIGluIGEgZ2l2ZW4geWVhciwgdGhlbiBwYXJhbWV0ZXJpemVkIGludG8gTG93LCBNZWRpdW0sIGFuZCBIaWdoIHJhbmtpbmdzLiAgVGhlIGJyZWFrIHBvaW50IGZvciBlYWNoIG9mIHRoZXNlIGdyb3VwaW5ncyBjYW4gYmUgYWRqdXN0ZWQgdXNpbmcgdGhlIHNsaWRlcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjcm9zc3RhYi4gIAoKIyMjKipCYXJjaGFydC1yZWxhdGVkIFZpc3VhbGl6YXRpb25zIHVzaW5nIFRhYmxlYXUqKgoKCiMjIyMqQ2FwTWV0cm8gU3RvcHMgYnkgWmlwY29kZSBhcyB0aGV5IFJlbGF0ZSB0byBSZXN0YXVyYW50IERlbnNpdHkqCkhlcmUgd2Ugc2VlIHZpc3VhbGl6ZWQgdGhlIG51bWJlciBvZiBidXMgc3RvcHMgcGVyIHppcGNvZGUsIGNvbG9yZWQgYnkgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGF0IHppcGNvZGUuIFRoaXMgdmlzdWFsaXphdGlvbiBhbHNvIHNob3dzIGFuIGF2ZXJhZ2UgbGluZSBmb3IgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0b3BzLiBBcyBpcyBldmlkZW50LCB0aGUgemlwY29kZXMgd2l0aCB0aGUgZGFya2VzdCBiYXJzICh0aG9zZSB3aXRoIHRoZSBoaWdoZXN0IHJlc3R1YXJhbnQgZGVuc2l0eSksIGFsbW9zdCBhbHdheXMgc3VycGFzcyB0aGUgYXZlcmFnZSBsaW5lLCBidXQgYWxzbyBnZW5lcmFsbHkgZ3JlYXRseSBzdXJwYXNzIGl0LiBUaGlzIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQgc3VnZ2VzdHMgdGhhdCwgaW4gZ2VuZXJhbCwgemlwY29kZXMgd2l0aCBhIGhpZ2hlciB0aGFuIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ1cyBzdG9wcyBhbHNvIGhhdmUgYSBoaWdoIHJlc3R1YXJhbnQgZGVuc2l0eS4KCjxjZW50ZXI+IVtUYWJsZWF1OiBTdG9wcyBieSBaaXBjb2RlXSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMUEucG5nKTwvY2VudGVyPgo8YnI+CjxjZW50ZXI+IVtUYWJsZWF1OiBTdG9wcyBieSBaaXBjb2RlLCBIaWdoIFJlc3RhdXJhbnQgRGVuc2l0eV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvVEJhcjFCLnBuZyk8L2NlbnRlcj4KCkluIFRhYmxlYXUsIHRoaXMgdmlzdWFsaXphdGlvbiBhbHNvIGFsbG93cyB5b3UgdG8gYWRqdXN0IHdoaWNoIHppcGNvZGVzIGFyZSBkaXNwbGF5ZWQgYmFzZWQgb24gYSBtaW5pbXVtIGFtb3VudCBvZiByZXN0YXVyYW50cywgYW5kIGFsc28gYmFzZWQgb24gd2hldGhlciB0aGUgemlwY29kZXMgYXJlIGFib3ZlIG9yIGJlbG93IHRoaXMgbWluaW11bS4KCiMjIyMqRm9yZWlnbiBQb3B1bGF0aW9uIHZzLiBSZXN0YXVyYW50IERlbnNpdHkqCkhlcmUgd2UgZmluZCBhIHZpc3VhbGl6YXRpb24gdGhhdCBzaG93Y2FzZXMgZm9yZWlnbiBwb3B1bGF0aW9uIGJ5IHppcGNvZGUsIGFuZCBpcyBjb2xvcmVkIHRvIHJlZmxlY3QgdGhlIHJlc3RhdXJhbnQgZGVuc2l0eSBvZiBlYWNoIHppcGNvZGUuIEluIFRhYmxlYXUsIHlvdSBhcmUgYWxzbyBhYmxlIHRvIHRvZ2dsZSBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIGEgaGlnaGVyIHRoYW4gYXZlcmFnZSwgb3IgYW4gYXQvYmVsb3cgYXZlcmFnZSBmb3JlaWduIHBvcHVsYXRpb24uCgo8Y2VudGVyPiFbVGFibGVhdTogUmVzdGF1cmFudCBEZW5zaXR5LCBMb3cgRm9yZWlnbiBQb3B1bGF0aW9uXSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMkEucG5nKTwvY2VudGVyPgo8YnI+CjxjZW50ZXI+IVtUYWJsZWF1OiBSZXN0YXVyYW50IERlbnNpdHksIEhpZ2ggRm9yZWlnbiBQb3B1bGF0aW9uXSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMkIucG5nKTwvY2VudGVyPgoKRnJvbSB0aGlzIGJhcmNoYXJ0LCBpdCB3b3VsZCBzZWVtIHRoYXQgaGlnaGVyIHRoYW4gYXZlcmFnZSBmb3JlaWduIHBvcHVsYXRlZCB6aXBjb2RlcyBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGEgaGlnaGVyIHJlc3RhdXJhbnQgZGVuc2l0eS4gT3ZlcmFsbCwgaXQgYXBwZWFycyB0aGF0IHJlc3RhdXJhbnQgZGVuc2l0eSBpcyBwcmV0dHkgZXZlbiBhY3Jvc3MgbGV2ZWxzIG9mIGZvcmVpZ24tYm9ybiBwb3B1bGF0aW9uIChpLmUuIHRoZXJlIGFyZSByZWxhdGl2ZWx5IHNpbWlsYXIgbnVtYmVycyBvZiBoaWdoIHJlc3RhdXJhbnQgZGVuc2l0eSB6aXBjb2RlcyBpbiBib3RoIGNhdGVnb3JpZXMpLiBUaGlzIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQgc3VnZ2VzdHMgdGhhdCByZXN0YXVyYW50IGRlbnNpdHkgbWF5IGJlIGZhaXJseSBpbmRlcGVuZGVudCBvZiBmb3JlaWduLSBvciBuYXRpdmUtYm9ybiBwb3B1bGF0aW9uIHN0YXR1cy4KCiMjIyMqU3RvcCB0byBSZXN0dWFyYW50IFJhdGlvcyBwZXIgWmlwY29kZSBieSBOYXRpdml0eSoKVGhpcyB2aXN1YWxpemF0aW9uIHNob3dzIHRoZSBwb3B1bGF0aW9ucyBvZiBOYXRpdmUsIE5hdHVyYWxpemVkLCBhbmQgTm9uLUNpdGl0emVuIGluaGFiaXRhbnRzIGZvciBlYWNoIHppcGNvZGUuIEZ1cnRoZXIsIHRoZXNlIGJhcmNoYXJ0cyBhcmUgY29sb3JlZCBieSB0aGUgcmVzdGF1cmFudCB0byBzdG9wIHJhdGlvIChkYXJrZXIgcHVycGxlIGluZGljYXRlcyBhIGhpZ2hlciByYXRpbykuIFRoZSBoaWdoZXN0IHJhdGlvcyBhcmUgYmV0d2VlbiA3ODcyMSBhbmQgNzg3MjQuIAoKPGNlbnRlcj4hW1RhYmxlYXU6IFN0b3BzIHRvIFJlc3RhdXJhbnRzIGJ5IE5hdGl2aXR5XSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMy5wbmcpPC9jZW50ZXI+CgpJbnRlcmVzdGluZ2x5LCB0aGUgcG9wdWxhdGlvbiBvZiBuYXRpdmUsIG5hdHVyYWxpemVkLCBhbmQgbm9uLWNpdGl6ZW4gcGVvcGxlcyBpcyBxdWl0ZSB2YXJpYWJsZSBhY3Jvc3MgemlwY29kZXMuIEFub3RoZXIgaW50ZXJlc3RpbmcgcG9pbnQgaXMgdGhhdCBmb3IgYWxsIHRocmVlIGNhdGVnb3JpZXMsIHRoZSBoaWdoZXN0IHJhdGlvcyBhcmUgbm90IGNvcnJlbGF0ZWQgd2l0aCB0aGUgaGlnaGVzdCBwb3B1bGF0aW9ucy4gVGhpcywgb2YgY291cnNlLCBzZWVtcyBub24taW50dWl0aXZlLCBhbmQgbWF5IGJlIGFuIGFyZWEgZm9yIGZ1dHVyZSBpbnF1aXJ5LgoKIyMqKlZpc3VhbGl6YXRpb25zIHVzaW5nIFNoaW55IGluIFIqKgpUaGUgc2NyZWVuc2hvdHMgYW5kIGRlc2NyaXB0aW9ucyBiZWxvdyBhcmUgYmFzZWQgb24gb3VyIGludGVyYWN0aXZlIHZpc3VhbGl6YXRpb24gYXBwLCBhY2Nlc3NpYmxlIGF0IGh0dHBzOi8va3ZhdWdobi5zaGlueWFwcHMuaW8vcmVzdGF1cmFudF9pbnNwZWN0aW9uLy4KCiMjIyoqQm94cGxvdCBWaXN1YWxpemF0aW9uIHVzaW5nIFNoaW55IGluIFIqKgpPbmUgbG93IHNjb3JlIGRvZXMgbm90IGluZGljYXRlIGEgc3lzdGVtaWMgcHJvYmxlbSB3aXRoIGEgcmVzdGF1cmFudCdzIGNsZWFubGluZXNzOyBiZWZvcmUganVkZ2luZyBhIHJlc3RhdXJhbnQgd2l0aCBhIGxvdyBzY29yZSwgaXQgYmVob292ZXMgdXMgdG8gY29uc2lkZXIgdGhlIG90aGVyIHNjb3JlcyBpdCBoYXMgcmVjZWl2ZWQuICBUaGlzIGJveHBsb3QgYWxsb3dzIHRoZSB1c2VyIHRvIGRvIGp1c3QgdGhhdC4gIEZpcnN0IHNlbGVjdCBhIGN1dG9vZiBwb2ludCBmb3Igc2NvcmVzLCB0aGVuIGNob29zZSBhIHppcGNvZGUgdG8gc2VlIGFsbCByZXN0YXVyYW50cyB0aGF0IGhhdmUgc2NvcmVkIGJlbG93IHRoYXQgbGV2ZWwgYXQgbGVhc3Qgb25lLiAgRWFjaCByZXN0YXVyYW50J3Mgc2NvcmVzIHdpbGwgZGlzcGxheSwgZ2l2aW5nIHRoZSB1c2VyIGFuIGlkZWEgb2Ygd2hldGhlciB0aGUgbG93IHNjb3JlIHdhcyBhIGZsdWtlIG9yIGEgc2lnbiBvZiBwcm9ibGVtcy4KCjxjZW50ZXI+IVtTaGlueTogU2NvcmVzIGJ5IFJlc3RhdXJhbnQgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JveEEucG5nKTwvY2VudGVyPiAKPGJyPiAKPGNlbnRlcj4hW1NoaW55OiBTY29yZXMgYnkgUmVzdGF1cmFudCBCb3hwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQm94Qi5wbmcpPC9jZW50ZXI+CgojIyMqKkhpc3RvZ3JhbSBWaXN1YWxpemF0aW9uIHVzaW5nIFNoaW55IGluIFIqKgpUaGlzIHZpc3VhbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIGdldCBhIGJyb2FkZXIgdmlldyBvZiB0aGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIHNjb3Jlcy4gIFRoZSB1c2VyIGlzIGdpdmVuIHRoZSBvcHRpb24gdG8gc2VsZWN0IHNjb3JlcyBmcm9tIGFueSBjb21iaW5hdGlvbiBvZiB5ZWFycy4gIFdoYXQncyBpbnRlcmVzdGluZyBoZXJlIGlzIHRoYXQgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcmVzdGF1cmFudCBpbnNwZWN0aW9ucyByZXN1bHQgaW4gInBhc3NpbmciIGdyYWRlcyBvZiA3MCBvciBoaWdoZXIuCgo8Y2VudGVyPiFbU2hpbnk6IEFsbCBTY29yZXMgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0hpc3RBLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBBbGwgU2NvcmVzIEhpc3RvZ3JhbV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0hpc3RCLnBuZyk8L2NlbnRlcj4KCiMjIyoqU2NhdHRlcnBsb3QgVmlzdWFsaXphdGlvbiB1c2luZyBTaGlueSBpbiBSKioKVGhlIFNjYXR0ZXJwbG90IHRhYiBpbmNsdWRlcyB0aHJlZSBzZXBhcmF0ZSB2aXN1YWxpemF0aW9ucyBkcmF3biBmcm9tIG9uZSBzZXQgb2YgZGF0YS4gIFRoZSBmaXJzdCB2aXN1YWxpemF0aW9uIHBsb3RzIHRoZSBwb3B1bGF0aW9uIG9mIGEgemlwY29kZSBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgaW4gdGhhdCB6aXBjb2RlLiAgVGhlIHNlY29uZCBncmFwaCBwbG90cyB0aGUgcG9wdWxhdGlvbiBwZXIgemlwY29kZSBhZ2FpbnN0IHRoZSBxdWFudGl0eSBvZiB0cmFuc2l0IHN0b3BzIGluIHRoYXQgemlwY29kZS4gIChUcmFuc2l0IHN0b3AgbG9jYXRpb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgQ2FwaXRhbCBNZXRybyBhbmQgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCBkYXRhLnRleGFzLmdvdjogaHR0cHM6Ly9kYXRhLnRleGFzLmdvdi9kYXRhc2V0L0dURlMvcjR2NC12ejI0ICkgIEFzIHlvdSBzZWUsIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwb3B1bGF0aW9uIGFuZCByZXN0YXVyYW50IG9yIHRyYW5zaXR5LXN0b3AgcXVhbnRpdHkgYXJlIHByZXR0eSB3ZWFrLiAgVGhlIHRoaXJkIHZpc3VhbGl6YXRpb24gaW4gdGhpcyBzZXQgZ3JhcGhzIHRyYW5zaXQgc3RvcHMgYnkgcmVzdGF1cmFudHMsIGFuZCBzaG93cyBhIG11Y2ggc3Ryb25nZXIgY29ycmVsYXRpb24uICBTZWUgYWJvdmUgZm9yIGEgZGlzY3Vzc2lvbiBvZiBvbmUgcG9zc2libGUgZXhwbGFuYXRpb24gZm9yIHRoaXMgcGF0dGVybiBvZiByZWxhdGlvbnNoaXBzLgoKPGNlbnRlcj4hW1NoaW55OiBTY2F0dGVycGxvdCBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlckRhdGEucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgYnkgUG9wdWxhdGlvbiBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIxLnBuZyk8L2NlbnRlcj4KPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFRyYW5zaXQgYnkgUG9wdWxhdGlvbiBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIyLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBSZXN0YXVyYW50IGJ5IFRyYW5zaXQgU2NhdHRlcnBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NTY2F0dGVyMy5wbmcpPC9jZW50ZXI+CgojIyMqKkNyb3NzdGFiIFZpc3VhbGl6YXRpb25zIHVzaW5nIFNoaW55IGluIFIqKgpDbGljayBoZXJlIHRvIGJlIHRha2VuIHRvIG91ciBwdWJsaXNoZWQgU2hpbnkgYXBwOiBodHRwczovL2t2YXVnaG4uc2hpbnlhcHBzLmlvL3Jlc3RhdXJhbnRfaW5zcGVjdGlvbi8KCiMjIyMqU2FmZXR5IEluZGV4KgpUaGlzIHZpc3VhbGl6YXRpb24gc3RhcnRzIHdpdGggYSBzb21ld2hhdC1hcmJpdHJhcnkgS1BJLCB0aGUgIlNhZmV0eSBJbmRleCwiIHRoYXQgdGFrZXMgaW50byBhY2NvdW50IGJvdGggdGhlIGF2ZXJhZ2Ugc2NvcmUgYW5kIHRoZSBsb3dlc3QgaW5zcGVjdGlvbiBzY29yZSByZWNlaXZlZCBmb3IgYSBnaXZlbiB6aXAgY29kZSBpbiBhIGdpdmVuIHllYXIuICBBIGhpZ2ggU2FmZXR5IEluZGV4IGluZGljYXRlcyBib3RoIGEgaGlnaCBhdmVyYWdlIHNjb3JlIGFuZCBhIGhpZ2ggbWluaW11bSBzY29yZS4gIFNldCB0aGUgcGFyYW1ldGVycyBob3dldmVyIHlvdSBsaWtlICgzIGFuZCA4IGFyZSByZWFzb25hYmxlIGRlZmF1bHRzKSBhbmQgY2hlY2sgdGhlIGNyb3NzdGFiIHRvIHNlZSBlYWNoIHppcCBjb2RlJ3MgcmF0aW5ncyBvdmVyIHRoZSBmb3VyLXllYXIgcGVyaW9kLgoKPGNlbnRlcj4hW1NoaW55OiBTYWZldHkgSW5kZXggRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMUEucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFNhZmV0eSBJbmRleCBDcm9zc3RhYl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMUIucG5nKTwvY2VudGVyPgoKIyMjIypMb3dlc3QgSW5zcGVjdGlvbiBTY29yZXMqClRoaXMgdmlzdWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGFuIGFyYml0cmFyeSBjdXRvZmYgcG9pbnQgYXMgYW4gYWlkIGZvciBpZGVudGlmeWluZyBsb3cgaW5zcGVjdGlvbiBzY29yZXMuICBUaGUgZGVmYXVsdCB2YWx1ZSwgNzAsIGlzIHRoZSBjdXRvZmYgZm9yIHJlc3RhdXJhbnQgaW5zcGVjdGlvbnM7IGxvd2VyIHNjb3JlcyB3aWxsIHRyaWdnZXIgYSByZWluc3BlY3Rpb24uICBBZnRlciBzZWxlY3RpbmcgYSBwYXJhbWV0ZXIgdXNpbmcgdGhlIHNsaWRlciBhbmQgcmVxdWVzdGluZyBkYXRhLCB0aGUgdXNlciBjYW4gc2VsZWN0IHRoZSAiQ3Jvc3N0YWIiIHRhYiB0byBzZWUgd2hpY2ggemlwIGNvZGVzIGFuZCB5ZWFycyBoYWQgdW5hY2NlcHRhYmx5IGxvdyBpbnNwZWN0aW9uIHNjb3Jlcy4KCjxjZW50ZXI+IVtTaGlueTogTG93ZXN0IEluc3BlY3Rpb24gU2NvcmVzIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NDcm9zczJBLnBuZyk8L2NlbnRlcj4KPGJyPgo8Y2VudGVyPiFbU2hpbnk6IExvd2VzdCBJbnNwZWN0aW9uIFNjb3JlcyBDcm9zc3RhYl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMkIucG5nKTwvY2VudGVyPgoKIyMjIypQZW9wbGUgcGVyIFJlc3RhdXJhbnQqCkF1c3RpbiBpcyBhIGZhc3QtZ3Jvd2luZyBjaXR5LCBhbmQgb3VyIHJlc3RhdXJhbnQgc2NlbmUgaXMgY3VycmVudGx5IGJvb21pbmcgYXMgd2VsbC4gIFRoaXMgdmlzdWFsaXphdGlvbiBhbGxvd3MgYSB1c2VyIHRvIHNlZSB3aGVyZSB0aGUgZGVuc2l0eSBvZiByZXN0YXVyYW50cyBjb21wYXJlZCB0byBwb3B1bGF0aW9uIGlzIGhpZ2hlc3QuICBVc2luZyBhIHB1YmxpYyBwb3B1bGF0aW9uIGRhdGFzZXQgZ2VuZXJhdGVkIGJ5IHRoZSBVUyBDZW5zdXMsIHdlIGNhbiBmaW5kIHRoZSBudW1iZXIgb2YgcGVvcGxlIHBlciByZXN0YXVyYW50IGluIGEgZ2l2ZW4gemlwIGNvZGU7IGFzIG1vcmUgcmVzdGF1cmFudHMgYXJlIGFkZGVkIChvciBmYWlsKSwgdGhlIHBlb3BsZS1wZXItcmVzdGF1cmFudCBudW1iZXIgY2hhbmdlcy4gIFRoZSBkZWZhdWx0IHZhbHVlcyBoaWdobGlnaHQgdGhlIGRlbnNpdHkgb2YgcmVzdGF1cmFudHMgaW4gNzg3MDEsIHdoaWNoIGlzIGRvd250b3duIEF1c3Rpbi4KCjxjZW50ZXI+IVtTaGlueTogUGVvcGxlIHBlciBSZXN0YXVyYW50IERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NDcm9zczNBLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBQZW9wbGUgcGVyIFJlc3RhdXJhbnQgQ3Jvc3N0YWJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NDcm9zczNCLnBuZyk8L2NlbnRlcj4KCiMjIyoqQmFyY2hhcnQgVmlzdWFsaXphdGlvbnMgdXNpbmcgU2hpbnkgaW4gUioqClRoZXNlIHZpc3VhbGl6YXRpb25zIGFyZSBhbHNvIGFjY2Vzc2libGUgYXQgaHR0cHM6Ly9rdmF1Z2huLnNoaW55YXBwcy5pby9yZXN0YXVyYW50X2luc3BlY3Rpb24vCgojIyMjKlNjb3JlcyBieSBaaXAgQ29kZSoKQmFyY2hhcnRzIGNhbiBiZSBhIGdvb2Qgd2F5IHRvIHF1aWNrbHkgaWRlbnRpZnkgdHJlbmRzIHZpc3VhbGx5LiAgSW4gdGhpcyB2aXN1YWxpemF0aW9uLCB0aGUgdXNlciBjYW4gY3JlYXRlIGEgc2V0IG9mIHppcCBjb2RlcyBvZiBpbnRlcmVzdCwgdGhlbiBzZWUgZWFjaCB6aXBjb2RlJ3MgYXZlcmFnZSBzY29yZSBwZXIgeWVhciBvdmVyIHRoZSB0aHJlZSBvciBmb3VyIHllYXJzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YXNldC4KCjxjZW50ZXI+IVtTaGlueTogU2NvcmVzIGJ5IFppcCBDb2RlIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIxQS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogU2NvcmVzIGJ5IFppcCBDb2RlIEJhciBDaGFydF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjFCLnBuZyk8L2NlbnRlcj4KCiMjIyMqVHJhbnNpdCBzdG9wcyBhbmQgcmVzdGF1cmFudCBkZW5zaXR5KgpDYXBpdGFsIE1ldHJvLCB0aGUgQXVzdGluLWFyZWEgdHJhbnNpdCBzZXJ2aWNlLCBoYXMgbWFkZSBpdHMgZGF0YSBmcmVlbHkgYXZhaWxhYmxlIGZvciBwdWJsaWMgZG93bmxvYWQuICBCeSBpbXBvcnRpbmcgdGhpcyBkYXRhIGludG8gZ2VvZ3JhcGhpYyBpbmZvcm1hdGlvbiBzb2Z0d2FyZSAoQXJjR0lTKSBhbmQgb3ZlcmxheWluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdHJhbnNpdCBzdG9wcyBvbiBhIHNoYXBlZmlsZSBvZiByZWdpb25hbCB6aXAgY29kZXMsIHdlIHdlcmUgYWJsZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMgcGVyIHppcCBjb2RlLiAgSW4gdGhpcyBiYXIgY2hhcnQsIHdlJ3JlIGV4YW1pbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHJhbnNpdCBkZW5zaXR5IGFuZCByZXN0YXVyYW50IGRlbnNpdHkuICBVc2UgdGhlIHNsaWRlciB0byBzZWxlY3QgemlwIGNvZGVzIHdpdGggbW9yZSB0aGFuIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0cmFuc2l0IHN0b3BzLCB0aGVuIGNvbXBhcmUgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGVzZSB6aXAgY29kZXMgdG8gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIHBlciB6aXAgY29kZSB0aHJvdWdob3V0IHRoZSByZWdpb24uICBUaGUgYmx1ZSBsaW5lIGlzIHRoZSBjYWxjdWxhdGVkIGF2ZXJhZ2UgZm9yIGFsbCBvZiB0aGUgc2VsZWN0ZWQgemlwIGNvZGVzLCBhbmQgdGhlIHJlZCBpcyB0aGUgZ3JhbmQgYXZlcmFnZSBmb3IgYWxsIG9mIHRoZSB6aXBjb2RlcyBpbiB0aGUgR3JlYXRlciBBdXN0aW4gYXJlYS4KCjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBUcmFuc2l0IFN0b3BzIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIyQS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBUcmFuc2l0IFN0b3BzIEJhciBDaGFydF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjJCLnBuZyk8L2NlbnRlcj4KCiMjIyMqTm9ubmF0aXZlIHJlc2lkZW50cyBhbmQgcmVzdGF1cmFudCBkZW5zaXR5KgpXb3VsZCB3ZSBleHBlY3QgemlwIGNvZGVzIHdpdGggY29tcGFyYXRpdmVseSBsYXJnZSBudW1iZXJzIG9mIG5vbm5hdGl2ZSAobmF0dXJhbGl6ZWQtY2l0aXplbiBvciBub25jaXRpemVuKSByZXNpZGVudHMgdG8gaGF2ZSBtb3JlIG9yIGZld2VyIHJlc3RhdXJhbnRzLCBvbiBhdmVyYWdlLCB0aGFuIHppcCBjb2RlcyB3aXRoIGxvd2VyIHBlcmNlbnRhZ2VzIG9mIG5vbm5hdGl2ZSByZXNpZGVudHM/ICBUaGlzIGJhcmNoYXJ0IGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgYSBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2Ygbm9ubmF0aXZlIHJlc2lkZW50cyBwZXIgemlwIGNvZGUsIHRoZW4gc2hvd3MgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGF0IHppcCBjb2RlIGFuZCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgcGVyIHppcCBjb2RlIGZvciBhbGwgb2YgdGhlIHF1YWxpZnlpbmcgemlwIGNvZGVzLiAgVGhpcyBhdmVyYWdlIGNhbiBiZSBjb21wYXJlZCB0byB0aGUgZ3JhbmQgYXZlcmFnZSB0aHJvdWdob3V0IHRoZSBncmVhdGVyIEF1c3RpbiBhcmVhLCBzaG93biBpbiByZWQuCgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgRGVuc2l0eSBhbmQgTm9ubmF0aXZlIFJlc2lkZW50cyBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQmFyM0EucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgRGVuc2l0eSBhbmQgTm9ubmF0aXZlIFJlc2lkZW50cyBCYXIgQ2hhcnRdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIzQi5wbmcpPC9jZW50ZXI+Cg==
=======
LS0tCnRpdGxlOiAiQXVzdGluIFJlc3RhcmFudCBJbnNwZWN0aW9ucyIKYXV0aG9yOiAiPGNlbnRlcj48Yj5NYXJjdXMgTWFydGluZXogYW5kIEthdGUgVmF1Z2huPC9iPjwvY2VudGVyPiIKZGF0ZTogIjxjZW50ZXI+TWF5IDIsIDIwMTc8L2NlbnRlcj4iCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0Ci0tLQoKIyoqSW50cm9kdWN0aW9uKioKIEluIHRoaXMgcHJvamVjdCwgd2UncmUgZXhhbWluaW5nIGluc3BlY3Rpb24gc2NvcmVzIGZvciByZXN0YXVyYW50cyBpbiBhbmQgYXJvdW5kIEF1c3RpbiwgVGV4YXMsIGZyb20gMjAxNCB0aHJvdWdoIGVhcmx5IDIwMTcuICBTY29yZXMgYXJlIGRldGVybWluZWQgdGhyb3VnaCByb3V0aW5lIGluc3BlY3Rpb25zLCB1c3VhbGx5IGNvbmR1Y3RlZCB0d2ljZSBhIHllYXIuICBJZiBhIHNjb3JlIGxvd2VyIHRoYW4gNzAgaXMgcmVjb3JkZWQgaW4gYSB5ZWFybHkgaW5zcGVjdGlvbiwgdGhlIHJlc3RhdXJhbnQgd2lsbCBiZSBzdWJqZWN0ZWQgdG8gb25lIG9yIG1vcmUgZm9sbG93dXAgdmlzaXRzIHRvIGVuc3VyZSBhIHJldHVybiB0byBjb21wbGlhbmNlLiAgQWxsIG9mIG91ciByZXN0YXVyYW50IGluc3BlY3Rpb24gcmVjb3JkcyBpbmNsdWRlIGdlb2dyYXBoaWNhbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiB6aXAgY29kZXMsIGFsbG93aW5nIHRoZSB1c2Ugb2YgYWRkaXRpb25hbCBkYXRhc2V0cyB0byBmdXJ0aGVyIGV4cGxvcmUgdGhlIGRhdGEuICBWaXNpdCBodHRwczovL2RhdGEud29ybGQva3ZhdWdobi9zLTE3LWR2LXByb2plY3QtNiB0byBleHBsb3JlIG91ciBkYXRhc2V0cywgb3Igc2VlIGJlbG93IGZvciB0aGUgdmlzdWFsaXphdGlvbnMgd2UndmUgbWFkZSBvZiB0aGUgZGF0YS4KCiMjKipSIENvbmZpZ3VyYXRpb24qKgpCZWxvdyB3ZSBkaXNwbGF5IG91ciBzZXNzaW9uSW5mbygpLgoKYGBge3IgU2Vzc2lvbkluZm8sIGVjaG89RkFMU0V9IApzZXNzaW9uSW5mbyhwYWNrYWdlPU5VTEwpCmBgYAoKIyoqVGhlIERhdGEqKgpUaGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIGRhdGFzZXQgd2FzIHByb3ZpZGVkIHRocm91Z2ggdGhlIENpdHkgb2YgQXVzdGluJ3MgT3BlbiBEYXRhIFBvcnRhbCwgaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi8uICBUaGlzIGZyZWUgZG93bmxvYWQgaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlIGZvcm1hdHMgYXQgaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi9IZWFsdGgvUmVzdGF1cmFudC1JbnNwZWN0aW9uLVNjb3Jlcy91dGh3LWE3aWguICBGb3IgdGhpcyBwcm9qZWN0LCB3ZSBkb3dubG9hZGVkIGEgQ1NWIGZpbGUgYW5kIGNsZWFuZWQgaXQgdXNpbmcgdGhlIEV4dHJhY3QtVHJhbnNsYXRlLUxvYWQgcHJvY2VkdXJlIG91dGxpbmVkIGJlbG93LgoKIyoqRXh0cmFjdC1UcmFuc2xhdGUtTG9hZCAoRVRMKSoqClRoZSBkYXRhc2V0IHdlIHJlY2VpdmVkIG5lZWRlZCBzb21lIGNsZWFuaW5nLCBhcyBpdCB3YXMgdW5yZWFkYWJsZSB0byBUYWJsZWF1IGluIGl0cyBvcmlnaW5hbCBDU1YgZm9ybWF0dGluZy4gIFdlIHVzZWQgdGhlIEV4dHJhY3QtVHJhbnNsYXRlLUxvYWQgbWV0aG9kIGRpc2N1c3NlZCBpbiBjbGFzcywgYW5kIGJ1aWx0IGFuIFIgc2NyaXB0IGZvdW5kIGF0ICIuLi8wMSBEYXRhL0VUTFJlc3RhdXJhbnQuUiIgIFdlIGFsc28gY2xlYW5lZCB1cCB0aGUgam9pbiBxdWVyeSB1c2VkIGluIG91ciBUYWJsZWF1IHZpc3VhbGl6YXRpb25zOyBpdCBjYW4gYmUgZm91bmQgYXQgIi4uLzAxIERhdGEvRVRMUXVlcnkuUiIgIElmIHlvdSdkIGxpa2UgdG8gZm9sbG93IGFsb25nLCBoZXJlJ3MgaG93IHdlIHByb2Nlc3NlZCB0aGUgcmVzdGF1cmFudCBpbnNwZWN0aW9uIGRhdGE6CgojIypTdGVwLUJ5LVN0ZXAgSW5zdHJ1Y3Rpb25zKgoqKkZpcnN0LCBkb3dubG9hZCB0aGUgdW5jbGVhbmVkIENTVjogaHR0cHM6Ly9kYXRhLmF1c3RpbnRleGFzLmdvdi9hcGkvdmlld3MvZWNtdi05eHhpL3Jvd3MuY3N2P2FjY2Vzc1R5cGU9RE9XTkxPQUQuIFByZXBlbmQgIlByZUVUTF8iIHRvIHRoZSBmaWxlIG5hbWUsIGFuZCBwdXQgaXQgaW4gYSBmb2xkZXIgY2FsbGVkIENTVnMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgcHJvamVjdCAoczE3ZHZwcm9qZWN0NS12YXVnaG4tY2FubmF0YS1tYXJ0aW5leikuKioKCiMjIypTdGVwIDE6IFNldCB1cCB0aGUgZW52aXJvbm1lbnQqCk5vdGUgdGhhdCB3ZSBoYXZlIG9uZSBjb2x1bW4gb2YgbnVtZXJpYyBkYXRhICgiU2NvcmUiKSwgb25lIGNvbHVtbiBvZiBkYXRlcyAoIkluc3BlY3Rpb24gRGF0ZSIpLCB0aHJlZSBjb2x1bW5zIG9mIHN0cmluZ3MgKCJSZXN0YXVyYW50IE5hbWUiLCAiQWRkcmVzcyIsIGFuZCAiUHJvY2VzcyBEZXNjcmlwdGlvbiIpLCBhbmQgdHdvIGNvbHVtbnMgb2YgbnVtZXJpYyBkYXRhIHVzZWQgY2F0ZWdvcmljYWxseSAoIlppcCBDb2RlIiBhbmQgIkZhY2lsaXR5IElEIikuICBGb3IgdGhlIHNha2Ugb2YgZWFzZSBvZiB1c2UsIHRoZXNlIGxhc3QgdHdvIGNvbHVtbnMgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MuCmBgYHtyIGV0bDF9CiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCJ+L3MxN2R2ZmluYWxwcm9qZWN0LXZhdWdobi1jYW5uYXRhLW1hcnRpbmV6LTEvMDAgRG9jcyIpCgojIFNldCBmaWxlcGF0aApmaWxlX3BhdGggPSAiLi4vLi4vQ1NWcy9QcmVFVExfUmVzdGF1cmFudF9JbnNwZWN0aW9uX1Njb3Jlcy5jc3YiCgojIENyZWF0ZSBkYXRhZnJhbWUgZnJvbSBvcmlnaW5hbCBDU1YKZGYgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIFN0YW5kYXJkaXplIGNvbHVtbiBuYW1lcwpuYW1lcyhkZikgPC0gZ3N1YigiXFwuKyIsICIgIiwgbmFtZXMoZGYpKQoKIyBQcmludCBjb2x1bW4gbmFtZXMgYW5kIHR5cGVzCnN0cihkZikKYGBgCgojIyMqU3RlcCAyOiBDb2xsZWN0IGNvbHVtbnMgYnkgdHlwZSoKV2UndmUgZ3JvdXBlZCB0aGUgZGF0ZSBjb2x1bW4gc2VwYXJhdGVseSBmcm9tIG1lYXN1cmVzIGFuZCBkaW1lbnNpb25zOyB3aGlsZSBUYWJsZWF1IHdpbGwgcmVjb2duaXplIHRoZXNlIGRhdGEgYXMgZGF0ZXMsIGl0IHNlZW1zIHBydWRlbnQgdG8gcmVjbGFzc2lmeSB0aGVtIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LgpgYGB7ciBldGwyfQojIFNlbGVjdCBzdHJpbmcgZGF0YSBhcyAnZGltZW5zaW9ucycKZGltZW5zaW9ucyA8LSBjKCJSZXN0YXVyYW50IE5hbWUiLCAiWmlwIENvZGUiLCAiQWRkcmVzcyIsICJQcm9jZXNzIERlc2NyaXB0aW9uIiwgIkZhY2lsaXR5IElEIikKCiMgU2VsZWN0IGRhdGVzIGFzICdkYXRlcycKZGF0ZXMgPC0gYygiSW5zcGVjdGlvbiBEYXRlIikKCiMgU2VsZWN0IGFsbCByZW1haW5pbmcgZGF0YSBhcyAnbWVhc3VyZXMnCm1lYXN1cmVzIDwtIHNldGRpZmYobmFtZXMoZGYpLCB1bmlvbihkaW1lbnNpb25zLCBkYXRlcykpCgpgYGAKCiMjIypTdGVwIDM6IFJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMqCkhlcmUgd2UgcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIGFsbCBvZiBvdXIgZGF0YS4gIFRoZXNlIGNoYXJhY3RlcnMgY2FuIHNlcnZlIG5vIHB1cnBvc2UgaW4gdGhlIGRhdGEsIGFuZCBtaWdodCBjYXVzZSBwcm9ibGVtcyBpbiB0aGUgYW5hbHlzaXMgcHJvY2Vzcy4gIFRvIGltcHJvdmUgcmVhZGFiaWxpdHksIHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgc3BhY2VzLgpgYGB7ciBldGwzfQojIEdldCByaWQgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGVhY2ggY29sdW1uLgpmb3IobiBpbiBuYW1lcyhkZikpIHsKICBkZltuXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltuXSwgZ3N1YiwgcGF0dGVybj0iW14gLX5dIixyZXBsYWNlbWVudD0gIiAiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp9CmBgYAoKIyMjKlN0ZXAgNDogTW9kaWZ5IHJlY29yZHMgaW4gZGltZW5zaW9ucyoKTm93IHdlIGdvIHRocm91Z2ggYWxsIG9mIHRoZSBjaGFyYWN0ZXItYmFzZWQgY29sdW1ucyAoZ3JvdXBlZCBhcyBkaW1lbnNpb25zKSBhbmQgcmVtb3ZlIHRyb3VibGVzb21lIGNoYXJhY3RlcnMuICBBbXBlcnNhbmRzIGFyZSByZXBsYWNlZCB3aXRoICJhbmQiLCBzZW1pY29sb25zIGFyZSByZXBsYWNlZCB3aXRoIGNvbG9ucywgYW5kIHNpbmdsZS0gYW5kIGRvdWJsZS1xdW90ZXMgYXJlIHJlbW92ZWQgb3V0cmlnaHQuICBEYXRhIG9mIE5BIChudWxsKSBpcyByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KYGBge3IgZXRsNH0KIyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSBOQSBkYXRhIHdpdGggYW4gZW1wdHkgc3RyaW5nCm5hMmVtcHR5U3RyaW5nIDwtIGZ1bmN0aW9uICh4KSB7CiAgeFtpcy5uYSh4KV0gPC0gIiIKICByZXR1cm4oeCkKfQojIFdlJ2xsIGFwcGx5IHRoaXMgdG8gYWxsIGNvbHVtbnMgZ3JvdXBlZCBhcyBkaW1lbnNpb25zCmlmKCBsZW5ndGgoZGltZW5zaW9ucykgPiAwKSB7CiAgZm9yKGQgaW4gZGltZW5zaW9ucykgewogICAgIyBDaGFuZ2UgTkEgdG8gdGhlIGVtcHR5IHN0cmluZy4KICAgIGRmW2RdIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW2RdLCBuYTJlbXB0eVN0cmluZyksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICMgR2V0IHJpZCBvZiAiIGFuZCAnIGluIGRpbWVuc2lvbnMuCiAgICBkZltkXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltkXSwgZ3N1YiwgcGF0dGVybj0iW1wiJ10iLHJlcGxhY2VtZW50PSAiIiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICMgQ2hhbmdlICYgdG8gYW5kIGluIGRpbWVuc2lvbnMuCiAgICBkZltkXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZltkXSwgZ3N1YiwgcGF0dGVybj0iJiIscmVwbGFjZW1lbnQ9ICIgYW5kICIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAjIENoYW5nZSA6IHRvIDsgaW4gZGltZW5zaW9ucy4KICAgIGRmW2RdIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW2RdLCBnc3ViLCBwYXR0ZXJuPSI6IixyZXBsYWNlbWVudD0gIjsiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIH0KfQoKYGBgCgojIyMqU3RlcCA1OiBNb2RpZnkgZGF0ZXMqCkhlcmUgd2UgZW5zdXJlIHRoYXQgZGF0ZXMgYXJlIGZvcm1hdHRlZCBjb3JyZWN0bHkuCmBgYHtyIGV0bDV9CmlmKCBsZW5ndGgoZGF0ZXMpID4gMSB8fCAhIGlzLm5hKGRhdGVzKSkgewogIGZvcih5IGluIGRhdGVzKSB7CiAgICAjIEZvcm1hdCBhcyBkYXRlcwogICAgZGZbeV0gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZbeV0sIGZ1bmN0aW9uKHkpIGFzLkRhdGUoeSwgZm9ybWF0ID0gIiVtLyVkLyV5IikpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgfQp9CmBgYAoKIyMjKlN0ZXAgNjogTW9kaWZ5IG1lYXN1cmVzKgpOb3cgd2UgdGFrZSBhbGwgb2YgdGhlIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgb3V0IG9mIG91ciBtZWFzdXJlcy4KYGBge3IgZXRsNn0KbmEyemVybyA8LSBmdW5jdGlvbiAoeCkgewogIHhbaXMubmEoeCldIDwtIDAKICByZXR1cm4oeCkKfQojIEdldCByaWQgb2YgYWxsIGNoYXJhY3RlcnMgaW4gbWVhc3VyZXMgZXhjZXB0IGZvciBudW1iZXJzLCB0aGUgLSBzaWduLCBhbmQgcGVyaW9kLmRpbWVuc2lvbnMsIGFuZCBjaGFuZ2UgTkEgdG8gMC4KaWYobGVuZ3RoKG1lYXN1cmVzKSA+IDEgfHwgISBpcy5uYShtZWFzdXJlcykpIHsKICBmb3IobSBpbiBtZWFzdXJlcykgewogICAgZGZbbV0gPC0gZGF0YS5mcmFtZShsYXBwbHkoZGZbbV0sIGdzdWIsIHBhdHRlcm49IlteLS0uMC05XSIscmVwbGFjZW1lbnQ9IiIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICBkZlttXSA8LSBkYXRhLmZyYW1lKGxhcHBseShkZlttXSwgbmEyemVybyksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgIGRmW21dIDwtIGRhdGEuZnJhbWUobGFwcGx5KGRmW21dLCBmdW5jdGlvbihtKSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihtKSkpKSAjIFRoaXMgaXMgbmVlZGVkIHRvIHR1cm4gbWVhc3VyZXMgYmFjayB0byBudW1lcmljIGJlY2F1c2UgZ3N1YiB0dXJucyB0aGVtIGludG8gc3RyaW5ncy4KICB9Cn0KYGBgCgojIyMqU3RlcCA3OiBEdW1teSBjaGVjayoKQWx3YXlzIGEgdXNlZnVsIHRoaW5nLiAgTGV0J3MgbG9vayBhdCBvdXIgZGF0YSBhbmQgc2VlIHdoYXQgd2UndmUgZ290LiAgV2UncmUgZXhwZWN0aW5nIGFsbCBkYXRhIHRvIGJlIGluIGNoYXJhY3RlciBmb3JtIGV4Y2VwdCAiU2NvcmUiLCB3aGljaCB3aWxsIGJlIG51bWVyaWMsIGFuZCBvdXIgZGF0ZSBjb2x1bW4gbmFtZWQgIkluc3BlY3Rpb24gRGF0ZSIuCmBgYHtyIGV0bDd9CiMgVGFrZSBhIGxvb2sgYW5kIG1ha2Ugc3VyZSBpdCdzIHdoYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZToKcHJpbnQoc3VtbWFyeShkZikpCmBgYAoKIyMjKlN0ZXAgODogV3JpdGUgdG8gYSBuZXcgZmlsZSoKT3VyIGRhdGEgbG9va3MgZ29vZCwgYW5kIHdlIG5lZWQgdG8gd3JpdGUgaXQgdG8gYSBuZXcgZmlsZS4KYGBge3IgZXRsOH0KIyBOb3cgd3JpdGUgaXQgdG8gYSBuZXcgY2xlYW4gZmlsZS4Kd3JpdGUuY3N2KGRmLCBnc3ViKCJQcmVFVExfIiwgIiIsIGZpbGVfcGF0aCksIHJvdy5uYW1lcz1GQUxTRSwgbmEgPSAiIikKYGBgCgojKipWaXN1YWxpemF0aW9ucyoqCgojIyoqSW50ZXJlc3RpbmcgVGhpbmdzKioKIyMjKipDaGluYXRvd24qKiAgCkdlbmVyYWxseSBzcGVha2luZywgbG93IHNjb3JlcyBhcmUgb3V0bGllcnMgZm9yIHJlc3RhdXJhbnRzLiAgVGhlIGluc3BlY3RvciBjYXVnaHQgdGhlbSBvbiBhIGJhZCBkYXksIHBlcmhhcHMuICBMb29rIGF0IHRoZSBoaXN0b2dyYW0gZm9yIGFuIGluZGljYXRpb24gb2YgdGhlIHByb3BvcnRpb24gb2YgcGFzc2luZyBzY29yZXMgKGFib3ZlIDcwKSB2ZXJzdXMgZmFpbGluZyBzY29yZXMuICAKPGNlbnRlcj4hW0FsbCBTY29yZXMgSGlzdG9ncmFtXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TSGlzdEIucG5nKTwvY2VudGVyPgo8YnI+CklmIHlvdSdyZSBpbnRlcmVzdGVkIGluIHNlZWluZyB0aGUgd2hvbGUgY29sbGVjdGlvbiBvZiBzY29yZXMgZm9yIGEgcmVzdGF1cmFudCB3aXRoIGF0IGxlYXN0IG9uZSBsb3cgc2NvcmUsIHVzZSBvdXIgU2hpbnkgYm94cGxvdCBhbmQgc2VsZWN0IHRoZSB6aXBjb2RlIG9mIGludGVyZXN0LiAgU29tZSByZXN0YXVyYW50cyBkZW1vbnN0cmF0ZSBhIHRyZW5kIGluIHRoZWlyIGxvdyBzY29yZXMgdGhhdCBnb2VzIGJleW9uZCAib25lIGJhZCBkYXkiLiAgQ2hpbmF0b3duLCBpbiA3ODczMSwgaXMgYSBnb29kIGV4YW1wbGUgb2YgdGhpcy4gIEEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyIGlzIGNvbnNpZGVyZWQgJ3Bhc3NpbmcsJyB3aGlsZSBhIHNjb3JlIGJlbG93IDcwIHRyaWdnZXJzIGFuIGF1dG9tYXRpYyByZWluc3BlY3Rpb24gb2YgdGhlIGZhY2lsaXR5LiAgUmVzdGF1cmFudHMgYXJlIGVuY291cmFnZWQgdG8gYWltIGZvciBzY29yZXMgYXBwcm9hY2hpbmcgMTAwLiAgQ2hpbmF0b3duIGlzIGFwcGFyZW50bHkganVzdCBhaW1pbmcgdG8gcGFzcy4gIFdpdGggYW4gYXZlcmFnZSBzY29yZSBvZiA3MSwgaXQncyBtZWV0aW5nIGl0cyBnb2FsLgo8Y2VudGVyPiFbQ2hpbmF0b3duJ3MgQXZlcmFnZSBTY29yZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JveEIucG5nKTwvY2VudGVyPgo8YnI+CgojIyMqKlRoZSBMaW1pdGF0aW9ucyBvZiBvdXIgRGF0YXNldCoqIApXZSBvcmlnaW5hbGx5IGV4cGVjdGVkIHN0cm9uZyBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIGEgZ2l2ZW4gemlwIGNvZGUgYW5kIHRoZSBwb3B1bGF0aW9uIG9mIHRoYXQgemlwIGNvZGUsIHdpdGggYW4gZXhwZWN0YXRpb24gdGhhdCBkb3dudG93biB3b3VsZCBiZSBhbiBvdXRsaWVyIChsb3RzIG9mIHJlc3RhdXJhbnRzLCByZWxhdGl2ZWx5IGZldyByZXNpZGVudHMpLiAgV2hlbiB3ZSBncmFwaGVkIG91ciBkYXRhLCB3ZSBmb3VuZCB0aGF0IHJlc3RhdXJhbnQgcXVhbnRpdHkgYW5kIHBvcHVsYXRpb24gd2VyZSBvbmx5IHdlYWtseSBjb3JyZWxhdGVkLCBhbmQgd2UgZm91bmQgYSBudW1iZXIgb2YgdW5leHBlY3RlZCBvdXRsaWVycy4gIAo8Y2VudGVyPiFbUmVzdGF1cmFudCBieSBQb3B1bGF0aW9uIFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjEucG5nKTwvY2VudGVyPgo8YnI+ClNpbWlsYXJseSwgd2UgZXhwZWN0ZWQgdGhhdCB0aGUgbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMgd291bGQgYmUgc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgaW4gYSBnaXZlbiB6aXBjb2RlLiAgVGhpcyB0aW1lLCBvdXIgZGF0YSBzdXBwb3J0ZWQgb3VyIGV4cGVjdGF0aW9ucywgd2l0aCBhIG1vZGVyYXRlbHkgc3Ryb25nIGNvcnJlbGF0aW9uIG9mIDAuNzU2LiAgCjxjZW50ZXI+IVtSZXN0YXVyYW50IGJ5IFRyYW5zaXQgU2NhdHRlcnBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NTY2F0dGVyMy5wbmcpPC9jZW50ZXI+Cjxicj4KQ3VyaW9zaXR5IHRoZW4gbGVkIHVzIHRvIHBsb3QgcG9wdWxhdGlvbiB2ZXJzdXMgbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMgZm9yIGEgZ2l2ZW4gemlwY29kZTsgYWdhaW4sIHRoZSB0d28gd2VyZSBvbmx5IHdlYWtseSBjb3JyZWxhdGVkLCB3aXRoIG1hbnkgb2YgdGhlIHNhbWUgb3V0bGllcnMuICAKPGNlbnRlcj4hW1RyYW5zaXQgYnkgUG9wdWxhdGlvbiBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIyLnBuZyk8L2NlbnRlcj4gCjxicj4KVGhpcyBwcm9tcHRlZCBhIGNsb3NlciBsb29rIGF0IHRob3NlIG91dGxpZXJzLCBhbmQgZGVtb25zdHJhdGVkIGEgc2hvcnRjb21pbmcgaW4gb3VyIGRhdGFzZXQuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgb3V0bGllcnMgd2l0aCBsYXJnZSBwb3B1bGF0aW9ucyBhbmQgZmV3IHRyYW5zaXQgc3RvcHMgb3IgcmVzdGF1cmFudHMgYXJlIGluIHRoZSBmYXIgc3VidXJicyBvZiBBdXN0aW4uICBUaGVzZSBhcmVhcyBhcmUgZ292ZXJuZWQgYnkgb3RoZXIgY2l2aWMgYm9kaWVzLCBhbmQgdGh1cyB0aGUgYnVsayBvZiB0aGVpciByZXN0YXVyYW50IGluc3BlY3Rpb25zIChhbmQsIHBvdGVudGlhbGx5LCB0cmFuc2l0KSB3aWxsIGJlIGNvbmR1Y3RlZCBieSBhbiBlbnRpdHkgb3RoZXIgdGhhbiB0aGUgQ2l0eSBvZiBBdXN0aW4uICBJbiBvcmRlciB0byBnZXQgYSBjbGVhbmVyIHZpZXcgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcHVsYXRpb24sIHRyYW5zaXQsIGFuZCByZXN0YXVyYW50IGRlbnNpdHksIHdlIHdvdWxkIG5lZWQgdG8gYWRqdXN0IG91ciBkYXRhIHRvIG9ubHkgaW5jbHVkZSBhcmVhcyB1bmRlciB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBDaXR5IG9mIEF1c3Rpbi4gCkEgZ29vZCB2aXN1YWxpemF0aW9uIG9mIHRoaXMgZGlzdHJpYnV0aW9uIGNhbiBiZSBzZWVuIGJlbG93Lgo8Y2VudGVyPiFbRGF0YXNldCBMaW1pdGF0aW9ucyBNYXBdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCT3V0bGllck1hcC5wbmcpPC9jZW50ZXI+Cjxicj4KCiMjIyoqUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBOb24tbmF0aXZlIFBvcHVsYXRpb24qKgpUaGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIG51bWJlciBvZiByZXNpZGVudHMgcGVyIHppcGNvZGUgdGhhdCBhcmUgbmF0aXZlIGNpdGl6ZW5zLCBhcyB3ZWxsIGFzIGhvdyBtYW55IHJlc2lkZW50cyBhcmUgbmF0dXJhbGl6ZWQgY2l0aXplbnMgb3Igbm9uY2l0aXplbnMuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgdmlzdWFsaXphdGlvbiwgd2UndmUgZ3JvdXBlZCAibmF0dXJhbGl6ZWQgY2l0aXplbnMiIGFuZCAibm9uY2l0aXplbnMiIGludG8gb25lIGNhdGVnb3J5LCAibm9uLW5hdGl2ZS4iICBXb3VsZCB6aXBjb2RlcyB3aXRoIHJlbGF0aXZlbHkgaGlnaCBwZXJjZW50YWdlcyBvZiBub24tbmF0aXZlIHJlc2lkZW50cyBiZSBtb3JlIG9yIGxlc3MgcmVzdGF1cmFudC1oZWF2eSB0aGFuIHppcGNvZGVzIHdpdGggbG93ZXIgcGVyY2VudGFnZXMgb2Ygbm9uLW5hdGl2ZSByZXNpZGVudHM/ICBJdCB0dXJucyBvdXQgdGhhdCB6aXAgY29kZXMgd2l0aCBoaWdoIHBlcmNlbnRhZ2VzIChpbiB0aGUgY2FzZSBvZiB0aGlzIHZpc3VhbGl6YXRpb24sIDI1JSBvciBtb3JlKSBub24tbmF0aXZlIHJlc2lkZW50cyBkbyBpbiBmYWN0IGhhdmUgc2lnbmlmaWNhbnRseSBtb3JlIHJlc3RhdXJhbnRzIG9uIGF2ZXJhZ2UgdGhhbiBvdGhlciB6aXBjb2Rlcy4KPGNlbnRlcj4hW05vbi1uYXRpdmUgUmVzaWRlbnRzXSguLi8wMyBWaXN1YWxpemF0aW9ucy9Ob25uYXRpdmUucG5nKTwvY2VudGVyPgo8YnI+CgoKIyMqKlZpc3VhbGl6YXRpb25zIHVzaW5nIFRhYmxlYXUqKgoKIyMjKipCb3hwbG90IHVzaW5nIFRhYmxlYXUqKgoKIyMjKipSYXcgU2NvcmVzLSBIaXN0b2dyYW0qKgpBcyBjYW4gYmUgc2VlbiBpbiB0aGUgdmlzdWFsaXphdGlvbiBiZWxvdywgdGhlIG1vc3QgY29tbW9uIHJhdyByZXN0YXVyYW50IGluc3BlY3Rpb24gc2NvcmUgaXMgYmV0d2VlbiA5MCBhbmQgMTAwLiBUaGUgOTAtOTUgYW5kIDk1LTEwMCBiaW5zIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZS4gVGhlIHNlY29uZCBtb3N0IGNvbW1vbiByYW5nZXMgYXJlIDg1LTkwIGFuZCAxMDAtMTA1LiBUaGVzZSBhcmUgYWxzbyB0aGUgc2FtZSBzaXplLCBidXQgYSBsaXR0bGUgb3ZlciBoYWxmIHRoZSBzaXplIG9mIHRoZSBtb3N0IGNvbW1vbiBzY29yZSByYW5nZS4gCgo8Y2VudGVyPiFbVGFibGVhdTogUmF3IFNjb3JlIEhpc3RvZ3JhbV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvVEhpc3QucG5nKTwvY2VudGVyPgoKVGhlIG5leHQgbGFyZ2VzdCBiaW4gaXMgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGxhcmdlc3QsIGFuZCB0aGlzIHBhdHRlcm4gY29udGludWVzIHVudGlsIHdlIGRyb3AgYmVsb3cgNzAuIFRoaXMgaXMgcGFydGljdWxhcmx5IGdvb2QgbmV3cywgYXMgaXQgaW1wbGllcyB0aGF0IGZhaWxpbmcgc2NvcmVzICh0aG9zZSBiZWxvdyA3MCkgYXJlIG5vdCB2ZXJ5IGNvbW1vbiBhdCBhbGwsIGFuZCBmdXJ0aGVybW9yZSB0aGF0IGV4Y2VwdGlvbmFsIHNjb3JlcyBhcmUgaGlnaGx5IGNvbW1vbi4KCiMjIyoqQ2FwTWV0cm8gU3RvcHMgYW5kIFJlc3RhdXJhbnQgRGVuc2l0eSBhcyB0aGV5IFJlbGF0ZSB0byBQb3B1bGF0aW9uLSBTY2F0dGVycGxvdCoqCkhlcmUgd2Ugc2VlIGEgY29tcHJlaGVuc2l2ZSB2aXN1YWxpemF0aW9uIHRoYXQgcmVmbGVjdHMgZGF0YSBhcyB3ZSd2ZSBzZWVuIGl0IGJlZm9yZSwgaW4gb3VyICJpbnRlcmVzdGluZyB0aGluZ3MiIHNlY3Rpb24uIFRoaXMgc2NhdHRlcnBsb3Qgc2hvd3MgcmVzdGF1cmFudCBhbmQgc3RvcCBkZW5zaXR5IHBlciB6aXBjb2RlLiBFYWNoIHBvaW50IGlzIHNpemVkIGJ5IHRoZSBwb3B1bGF0aW9uIG9mIHRoYXQgemlwY29kZS4gVWx0aW1hdGVseSwgd2Ugc2VlIGFuIG92ZXJhbGwgcG9zaXRpdmUgdHJlbmQuIEhvd2V2ZXIsIHVwb24gY2xvc2VyIGV4YW1pbmF0aW9uLCBpdCBpcyBjbGVhciB0aGF0IG1hbnkgaGlnaCBwb3B1bGF0aW9uIHppcGNvZGVzIGhhdmUgYSBsb3dlciByZXN0YXVyYW50IGFuZCBzdG9wIGRlbnNpdHkuIAoKPGNlbnRlcj4hW1RhYmxlYXU6IFJlc3RhdXJhbnQgYW5kIFN0b3AgRGVuc2l0eSBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvVEJTY2F0dGVycGxvdC5wbmcpPC9jZW50ZXI+CgpUaGUgaW1wbGljYXRpb25zIG9mIHRoaXMgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzY3Vzc2VkIGluIHByZXZpb3VzIHNlY3Rpb25zLiBIb3dldmVyLCBpdCBpcyBhbHNvIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBtYW55IHppcGNvZGVzIChyZWdhcmRsZXNzIG9mIHBvcHVsYXRpb24gc2l6ZSksIGFyZSBncm91cGVkIHRvd2FyZHMgdGhlIGxvd2VyIHRvIG1lZGl1bSByZXN0YXVyYW50IGFuZCBzdG9wIGRlbnNpdHkgYXJlYS4gSW4gZmFjdCwgdGhlIGZ1cnRoZXIgb3V0IGluIGVpdGhlciBkaXJlY3Rpb24geW91IGdvLCB0aGUgbGVzcyBpbnN0YW5jZXMgdGhlcmUgYXJlLiBUaGlzIGxpa2VseSBzaG93cyB0aGF0IHdoaWxlIHRoZXJlIGlzIGEgc2xpZ2h0IHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gc3RvcCBhbmQgcmVzdGF1cmFudCBkZW5zaXR5LCBtb3N0IGFyZWFzIGFyZSBub3QgbGlrZWx5IHRvIGhhdmUgYW4gZXhjZXB0aW9uYWwgbnVtYmVyIG9mIGVpaHRlci4gCgojIyMqKkNyb3NzdGFiLXJlbGF0ZWQgVmlzdWFsaXphdGlvbnMgdXNpbmcgVGFibGVhdSoqCkJlbG93IHlvdSB3aWxsIGZpbmQgdGhlIHZpc3VhbGl6YXRpb25zIHdlIGNyZWF0ZWQgdXNpbmcgVGFibGVhdS4gRWFjaCB2aXN1YWxpemF0aW9uIGlzIG9ubHkgYSBmcmFjdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdmlld2VkIGluIFRhYmxlYXUsIGFzIHRoZXNlIGNyb3NzdGFicyBjYW5ub3Qgc2hvd2Nhc2UgYWxsIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXQgb25jZS4gIE91ciBUYWJsZWF1IHdvcmtib29rIGlzIGluY2x1ZGVkIGluIG91ciByZXBvc2l0b3J5IGluIHRoZSBmb2xkZXIgMDEgRGF0YS4KCiMjIyMqSW5zcGVjdGlvbiBTY29yZXMsIEFyZWEsIGFuZCBJbmNvbWUqClRoaXMgY3Jvc3N0YWIgc2hvd3MgYnkgeWVhciBhbmQgemlwY29kZSAoaW4gQXVzdGluKSwgdGhlIGF2ZXJhZ2UgcmVzdGF1cmFudCBpbnNwZWN0aW9uIHNjb3JlLiBUaGUgY3Jvc3N0YWIgaXMgY29sb3JlZCBieSB0aGUgcGVyY2VudGFnZSBvZiBob3VzZWhvbGRzIGluIGVhY2ggYXJlYSB1bmRlciB0aGUgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lIChwdWxsZWQgZnJvbSBVUyBDZW5zdXMgZGF0YSkuIEFzIGlzIGV2aWRlbnQsIGF2ZXJhZ2Ugc2NvcmVzIHJlbWFpbiByZWxhdGl2ZWx5IGhpZ2ggYWNyb3NzIHBvdmVydHkgbGV2ZWxzIGFuZCB6aXBjb2Rlcy4gSW4gVGFibGVhdSB5b3UgYXJlIGFibGUgdG8gY3ljbGUgdGhyb3VnaCB6aXBjb2RlcyBpbiB0aGUgd2VzdGVybiBvciBlYXN0ZXJuIGhhbGYgb2YgdGhlIGdyZWF0ZXIgQXVzdGluIGFyZWEuIEV2ZW4gYXQgdGhpcyBsZXZlbCwgYXZlcmFnZSBzY29yZXMgcmVtYWluIHNpbWlsYXIuIFRoZXJlIGFyZSBtb3JlIGF2ZXJhZ2Ugc2NvcmVzIGJlbG93IDkwIGluIHRoZSBlYXN0ZXJuIHNlY3Rpb24sIGJ1dCB0aGlzIGlzIGxpa2VseSBub3Qgc2lnbmlmaWNhbnQuCgo8Y2VudGVyPiFbVGFibGVhdTogU2NvcmVzIGJ5IEluY29tZSBhbmQgQXJlYV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvQ3Jvc3N0YWJBdmVyYWdlU2NvcmVieVBvdmVydHlMZXZlbC5wbmcpPC9jZW50ZXI+CgpJdCBpcyBwb3NzaWJsZSB0aGlzIGlzIHVuaXF1ZSB0byBBdXN0aW4sIGFuZCBtYXkgYmUgYSBjb25zZXF1ZW5jZSBvZiBzdHJpbmdlbnQgZm9vZCBzYWZldHkgY29kZSBpbiB0aGVzZSBhcmVhcy4gRnVydGhlciBhbmFseXNpcyB3b3VsZCBuZWVkIHRvIGJlIGRvbmUgdG8gc2VlIGlmIHRoZXNlIGNvcnJlbGF0aW9ucyBhcmUgdHJ1ZSBlbHNld2hlcmUgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuCgojIyMjKkF2ZXJhZ2UgSW5zcGVjdGlvbiBTY29yZXMgR2VvZ3JhcGhpY2FsbHkqCkFzIGNhbiBiZSBzZWVuLCB0aGlzIHZpc3VhbGl6YXRpb24gZGlzcGxheXMgdGhlIGF2ZXJhZ2UgaW5zcGVjdGlvbnMgc2NvcmUgZm9yIGVhY2ggemlwY29kZSBhcmVhLiBFYWNoIHppcGNvZGUncyBjb2xvciBpcyBkZXRlcm1pbmVkIGJ5IGl0cyBhdmVyYWdlIGluc3BlY3Rpb24gc2NvcmUncyBwcm94aW1pdHkgdG8gdGhlIGdyYW5kIGF2ZXJhZ2UgZm9yIHRoZSB5ZWFyKHMpIHNlbGVjdGVkIGluIHRoZSBmaWx0ZXIuICBUaGlzIGlzIGRvbmUgdXNpbmcgYSBjYWxjdWxhdGVkIGZpZWxkLCBhbmQgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRoZSB0aGUgZGF0YSBzZWxlY3RlZCBpbiB0aGUgWWVhciBmaWx0ZXIuICBJZiBhcnJpdmluZyBhdCB0aGlzIG1hcCBieSBjbGlja2luZyBvbiBlaXRoZXIgb2YgdGhlIGNyb3NzdGFicywgdGhlIHppcCBjb2RlcyB3aWxsIGRpc3BsYXkgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgZ3JhbmQgYXZlcmFnZSBvZiB0aGUgc2VsZWN0ZWQgeWVhci4KCjxjZW50ZXI+IVtUYWJsZWF1OiBNYXAgb2YgQXZlcmFnZSBJbnNwZWN0aW9uIFNjb3Jlc10oLi4vMDMgVmlzdWFsaXphdGlvbnMvQ3Jvc3N0YWJJbnNwZWN0aW9uU2NvcmVNYXAucG5nKTwvY2VudGVyPgoKSXQgaXMgYWdhaW4gZXZpZGVudCB0aGF0IGF2ZXJhZ2Ugc2NvcmVzIGFyZSByZWxhdGl2ZWx5IGhpZ2ggYWNyb3NzIGVhY2ggYXJlYS4gCgojIyMjKkF2ZXJhZ2UgU2NvcmUgYnkgWWVhcioKVGhpcyBoaWdobHkgY29tcHJlaGVuc2l2ZSB2aXN1YWxpemF0aW9uIHNob3dzIHVzIHRocmVlIG1haW4gcGllY2VzIG9mIGluZm9ybWF0aW9uOiBhdmVyYWdlIHNjb3JlLCBtaW5pbXVtIHNjb3JlLCBhbmQgc2FmZXR5IGluZGV4LiBBcyBoYXMgYmVlbiBwcmV2aW91c2x5IG5vdGVkLCBhdmVyYWdlIHNjb3JlcyBhcmUgcmVsYXRpdmVseSBoaWdoIGluIGVhY2ggemlwY29kZS4gTWludW11bSBzY29yZXMgY2FuIGJlIHF1aXRlIGxvdyAob25lIG9mIHRoZSBsb3dlc3Qgc2NvcmVzIGlzIDM2KSwgYnV0IHRoZXNlIGFyZSBmZXcgYW5kIGZhciBiZXR3ZWVuLgoKPGNlbnRlcj4hW1RhYmxlYXU6IEF2ZXJhZ2UgU2NvcmUgYnkgWWVhcl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvQ3Jvc3N0YWJTY29yZXNieVllYXIucG5nKTwvY2VudGVyPgoKVGhpcyBjcm9zc3RhYiBpcyBhbHNvIGNvbG9yZWQgYnkgYSBTYWZldHkgSW5kZXguICBUaGlzIEtQSSBpcyBiYXNlZCBpbiBhIGNhbGN1bGF0ZWQgZmllbGQgdGhhdCBhY2NvdW50cyBmb3IgdGhlIGF2ZXJhZ2Ugc2NvcmUgYW5kIG1pbmltdW0gc2NvcmUgZm9yIGEgZ2l2ZW4gemlwIGNvZGUgaW4gYSBnaXZlbiB5ZWFyLCB0aGVuIHBhcmFtZXRlcml6ZWQgaW50byBMb3csIE1lZGl1bSwgYW5kIEhpZ2ggcmFua2luZ3MuICBUaGUgYnJlYWsgcG9pbnQgZm9yIGVhY2ggb2YgdGhlc2UgZ3JvdXBpbmdzIGNhbiBiZSBhZGp1c3RlZCB1c2luZyB0aGUgc2xpZGVycyB0byB0aGUgcmlnaHQgb2YgdGhlIGNyb3NzdGFiLiAgCgojIyMqKkJhcmNoYXJ0LXJlbGF0ZWQgVmlzdWFsaXphdGlvbnMgdXNpbmcgVGFibGVhdSoqCgoKIyMjIypDYXBNZXRybyBTdG9wcyBieSBaaXBjb2RlIGFzIHRoZXkgUmVsYXRlIHRvIFJlc3RhdXJhbnQgRGVuc2l0eSoKSGVyZSB3ZSBzZWUgdmlzdWFsaXplZCB0aGUgbnVtYmVyIG9mIGJ1cyBzdG9wcyBwZXIgemlwY29kZSwgY29sb3JlZCBieSB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIHRoYXQgemlwY29kZS4gVGhpcyB2aXN1YWxpemF0aW9uIGFsc28gc2hvd3MgYW4gYXZlcmFnZSBsaW5lIGZvciB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RvcHMuIEFzIGlzIGV2aWRlbnQsIHRoZSB6aXBjb2RlcyB3aXRoIHRoZSBkYXJrZXN0IGJhcnMgKHRob3NlIHdpdGggdGhlIGhpZ2hlc3QgcmVzdHVhcmFudCBkZW5zaXR5KSwgYWxtb3N0IGFsd2F5cyBzdXJwYXNzIHRoZSBhdmVyYWdlIGxpbmUsIGJ1dCBhbHNvIGdlbmVyYWxseSBncmVhdGx5IHN1cnBhc3MgaXQuIFRoaXMgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBzdWdnZXN0cyB0aGF0LCBpbiBnZW5lcmFsLCB6aXBjb2RlcyB3aXRoIGEgaGlnaGVyIHRoYW4gYXZlcmFnZSBudW1iZXIgb2YgYnVzIHN0b3BzIGFsc28gaGF2ZSBhIGhpZ2ggcmVzdHVhcmFudCBkZW5zaXR5LgoKPGNlbnRlcj4hW1RhYmxlYXU6IFN0b3BzIGJ5IFppcGNvZGVdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCYXIxQS5wbmcpPC9jZW50ZXI+Cjxicj4KPGNlbnRlcj4hW1RhYmxlYXU6IFN0b3BzIGJ5IFppcGNvZGUsIEhpZ2ggUmVzdGF1cmFudCBEZW5zaXR5XSguLi8wMyBWaXN1YWxpemF0aW9ucy9UQmFyMUIucG5nKTwvY2VudGVyPgoKSW4gVGFibGVhdSwgdGhpcyB2aXN1YWxpemF0aW9uIGFsc28gYWxsb3dzIHlvdSB0byBhZGp1c3Qgd2hpY2ggemlwY29kZXMgYXJlIGRpc3BsYXllZCBiYXNlZCBvbiBhIG1pbmltdW0gYW1vdW50IG9mIHJlc3RhdXJhbnRzLCBhbmQgYWxzbyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB6aXBjb2RlcyBhcmUgYWJvdmUgb3IgYmVsb3cgdGhpcyBtaW5pbXVtLgoKIyMjIypGb3JlaWduIFBvcHVsYXRpb24gdnMuIFJlc3RhdXJhbnQgRGVuc2l0eSoKSGVyZSB3ZSBmaW5kIGEgdmlzdWFsaXphdGlvbiB0aGF0IHNob3djYXNlcyBmb3JlaWduIHBvcHVsYXRpb24gYnkgemlwY29kZSwgYW5kIGlzIGNvbG9yZWQgdG8gcmVmbGVjdCB0aGUgcmVzdGF1cmFudCBkZW5zaXR5IG9mIGVhY2ggemlwY29kZS4gSW4gVGFibGVhdSwgeW91IGFyZSBhbHNvIGFibGUgdG8gdG9nZ2xlIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gYSBoaWdoZXIgdGhhbiBhdmVyYWdlLCBvciBhbiBhdC9iZWxvdyBhdmVyYWdlIGZvcmVpZ24gcG9wdWxhdGlvbi4KCjxjZW50ZXI+IVtUYWJsZWF1OiBSZXN0YXVyYW50IERlbnNpdHksIExvdyBGb3JlaWduIFBvcHVsYXRpb25dKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCYXIyQS5wbmcpPC9jZW50ZXI+Cjxicj4KPGNlbnRlcj4hW1RhYmxlYXU6IFJlc3RhdXJhbnQgRGVuc2l0eSwgSGlnaCBGb3JlaWduIFBvcHVsYXRpb25dKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCYXIyQi5wbmcpPC9jZW50ZXI+CgpGcm9tIHRoaXMgYmFyY2hhcnQsIGl0IHdvdWxkIHNlZW0gdGhhdCBoaWdoZXIgdGhhbiBhdmVyYWdlIGZvcmVpZ24gcG9wdWxhdGVkIHppcGNvZGVzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBoaWdoZXIgcmVzdGF1cmFudCBkZW5zaXR5LiBPdmVyYWxsLCBpdCBhcHBlYXJzIHRoYXQgcmVzdGF1cmFudCBkZW5zaXR5IGlzIHByZXR0eSBldmVuIGFjcm9zcyBsZXZlbHMgb2YgZm9yZWlnbi1ib3JuIHBvcHVsYXRpb24gKGkuZS4gdGhlcmUgYXJlIHJlbGF0aXZlbHkgc2ltaWxhciBudW1iZXJzIG9mIGhpZ2ggcmVzdGF1cmFudCBkZW5zaXR5IHppcGNvZGVzIGluIGJvdGggY2F0ZWdvcmllcykuIFRoaXMgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBzdWdnZXN0cyB0aGF0IHJlc3RhdXJhbnQgZGVuc2l0eSBtYXkgYmUgZmFpcmx5IGluZGVwZW5kZW50IG9mIGZvcmVpZ24tIG9yIG5hdGl2ZS1ib3JuIHBvcHVsYXRpb24gc3RhdHVzLgoKIyMjIypTdG9wIHRvIFJlc3R1YXJhbnQgUmF0aW9zIHBlciBaaXBjb2RlIGJ5IE5hdGl2aXR5KgpUaGlzIHZpc3VhbGl6YXRpb24gc2hvd3MgdGhlIHBvcHVsYXRpb25zIG9mIE5hdGl2ZSwgTmF0dXJhbGl6ZWQsIGFuZCBOb24tQ2l0aXR6ZW4gaW5oYWJpdGFudHMgZm9yIGVhY2ggemlwY29kZS4gRnVydGhlciwgdGhlc2UgYmFyY2hhcnRzIGFyZSBjb2xvcmVkIGJ5IHRoZSByZXN0YXVyYW50IHRvIHN0b3AgcmF0aW8gKGRhcmtlciBwdXJwbGUgaW5kaWNhdGVzIGEgaGlnaGVyIHJhdGlvKS4gVGhlIGhpZ2hlc3QgcmF0aW9zIGFyZSBiZXR3ZWVuIDc4NzIxIGFuZCA3ODcyNC4gCgo8Y2VudGVyPiFbVGFibGVhdTogU3RvcHMgdG8gUmVzdGF1cmFudHMgYnkgTmF0aXZpdHldKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RCYXIzLnBuZyk8L2NlbnRlcj4KCkludGVyZXN0aW5nbHksIHRoZSBwb3B1bGF0aW9uIG9mIG5hdGl2ZSwgbmF0dXJhbGl6ZWQsIGFuZCBub24tY2l0aXplbiBwZW9wbGVzIGlzIHF1aXRlIHZhcmlhYmxlIGFjcm9zcyB6aXBjb2Rlcy4gQW5vdGhlciBpbnRlcmVzdGluZyBwb2ludCBpcyB0aGF0IGZvciBhbGwgdGhyZWUgY2F0ZWdvcmllcywgdGhlIGhpZ2hlc3QgcmF0aW9zIGFyZSBub3QgY29ycmVsYXRlZCB3aXRoIHRoZSBoaWdoZXN0IHBvcHVsYXRpb25zLiBUaGlzLCBvZiBjb3Vyc2UsIHNlZW1zIG5vbi1pbnR1aXRpdmUsIGFuZCBtYXkgYmUgYW4gYXJlYSBmb3IgZnV0dXJlIGlucXVpcnkuCgojIyoqVmlzdWFsaXphdGlvbnMgdXNpbmcgU2hpbnkgaW4gUioqClRoZSBzY3JlZW5zaG90cyBhbmQgZGVzY3JpcHRpb25zIGJlbG93IGFyZSBiYXNlZCBvbiBvdXIgaW50ZXJhY3RpdmUgdmlzdWFsaXphdGlvbiBhcHAsIGFjY2Vzc2libGUgYXQgaHR0cHM6Ly9rdmF1Z2huLnNoaW55YXBwcy5pby9yZXN0YXVyYW50X2luc3BlY3Rpb24vLgoKIyMjKipCb3hwbG90IFZpc3VhbGl6YXRpb24gdXNpbmcgU2hpbnkgaW4gUioqCk9uZSBsb3cgc2NvcmUgZG9lcyBub3QgaW5kaWNhdGUgYSBzeXN0ZW1pYyBwcm9ibGVtIHdpdGggYSByZXN0YXVyYW50J3MgY2xlYW5saW5lc3M7IGJlZm9yZSBqdWRnaW5nIGEgcmVzdGF1cmFudCB3aXRoIGEgbG93IHNjb3JlLCBpdCBiZWhvb3ZlcyB1cyB0byBjb25zaWRlciB0aGUgb3RoZXIgc2NvcmVzIGl0IGhhcyByZWNlaXZlZC4gIFRoaXMgYm94cGxvdCBhbGxvd3MgdGhlIHVzZXIgdG8gZG8ganVzdCB0aGF0LiAgRmlyc3Qgc2VsZWN0IGEgY3V0b29mIHBvaW50IGZvciBzY29yZXMsIHRoZW4gY2hvb3NlIGEgemlwY29kZSB0byBzZWUgYWxsIHJlc3RhdXJhbnRzIHRoYXQgaGF2ZSBzY29yZWQgYmVsb3cgdGhhdCBsZXZlbCBhdCBsZWFzdCBvbmUuICBFYWNoIHJlc3RhdXJhbnQncyBzY29yZXMgd2lsbCBkaXNwbGF5LCBnaXZpbmcgdGhlIHVzZXIgYW4gaWRlYSBvZiB3aGV0aGVyIHRoZSBsb3cgc2NvcmUgd2FzIGEgZmx1a2Ugb3IgYSBzaWduIG9mIHByb2JsZW1zLgoKPGNlbnRlcj4hW1NoaW55OiBTY29yZXMgYnkgUmVzdGF1cmFudCBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQm94QS5wbmcpPC9jZW50ZXI+IAo8YnI+IAo8Y2VudGVyPiFbU2hpbnk6IFNjb3JlcyBieSBSZXN0YXVyYW50IEJveHBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCb3hCLnBuZyk8L2NlbnRlcj4KCiMjIyoqSGlzdG9ncmFtIFZpc3VhbGl6YXRpb24gdXNpbmcgU2hpbnkgaW4gUioqClRoaXMgdmlzdWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gZ2V0IGEgYnJvYWRlciB2aWV3IG9mIHRoZSByZXN0YXVyYW50IGluc3BlY3Rpb24gc2NvcmVzLiAgVGhlIHVzZXIgaXMgZ2l2ZW4gdGhlIG9wdGlvbiB0byBzZWxlY3Qgc2NvcmVzIGZyb20gYW55IGNvbWJpbmF0aW9uIG9mIHllYXJzLiAgV2hhdCdzIGludGVyZXN0aW5nIGhlcmUgaXMgdGhhdCB0aGUgdmFzdCBtYWpvcml0eSBvZiByZXN0YXVyYW50IGluc3BlY3Rpb25zIHJlc3VsdCBpbiAicGFzc2luZyIgZ3JhZGVzIG9mIDcwIG9yIGhpZ2hlci4KCjxjZW50ZXI+IVtTaGlueTogQWxsIFNjb3JlcyBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TSGlzdEEucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IEFsbCBTY29yZXMgSGlzdG9ncmFtXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TSGlzdEIucG5nKTwvY2VudGVyPgoKIyMjKipTY2F0dGVycGxvdCBWaXN1YWxpemF0aW9uIHVzaW5nIFNoaW55IGluIFIqKgpUaGUgU2NhdHRlcnBsb3QgdGFiIGluY2x1ZGVzIHRocmVlIHNlcGFyYXRlIHZpc3VhbGl6YXRpb25zIGRyYXduIGZyb20gb25lIHNldCBvZiBkYXRhLiAgVGhlIGZpcnN0IHZpc3VhbGl6YXRpb24gcGxvdHMgdGhlIHBvcHVsYXRpb24gb2YgYSB6aXBjb2RlIGFnYWluc3QgdGhlIG51bWJlciBvZiByZXN0YXVyYW50cyBpbiB0aGF0IHppcGNvZGUuICBUaGUgc2Vjb25kIGdyYXBoIHBsb3RzIHRoZSBwb3B1bGF0aW9uIHBlciB6aXBjb2RlIGFnYWluc3QgdGhlIHF1YW50aXR5IG9mIHRyYW5zaXQgc3RvcHMgaW4gdGhhdCB6aXBjb2RlLiAgKFRyYW5zaXQgc3RvcCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBDYXBpdGFsIE1ldHJvIGFuZCBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIGRhdGEudGV4YXMuZ292OiBodHRwczovL2RhdGEudGV4YXMuZ292L2RhdGFzZXQvR1RGUy9yNHY0LXZ6MjQgKSAgQXMgeW91IHNlZSwgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBvcHVsYXRpb24gYW5kIHJlc3RhdXJhbnQgb3IgdHJhbnNpdHktc3RvcCBxdWFudGl0eSBhcmUgcHJldHR5IHdlYWsuICBUaGUgdGhpcmQgdmlzdWFsaXphdGlvbiBpbiB0aGlzIHNldCBncmFwaHMgdHJhbnNpdCBzdG9wcyBieSByZXN0YXVyYW50cywgYW5kIHNob3dzIGEgbXVjaCBzdHJvbmdlciBjb3JyZWxhdGlvbi4gIFNlZSBhYm92ZSBmb3IgYSBkaXNjdXNzaW9uIG9mIG9uZSBwb3NzaWJsZSBleHBsYW5hdGlvbiBmb3IgdGhpcyBwYXR0ZXJuIG9mIHJlbGF0aW9uc2hpcHMuCgo8Y2VudGVyPiFbU2hpbnk6IFNjYXR0ZXJwbG90IERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NTY2F0dGVyRGF0YS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBieSBQb3B1bGF0aW9uIFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjEucG5nKTwvY2VudGVyPgo8YnI+CjxjZW50ZXI+IVtTaGlueTogVHJhbnNpdCBieSBQb3B1bGF0aW9uIFNjYXR0ZXJwbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TU2NhdHRlcjIucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFJlc3RhdXJhbnQgYnkgVHJhbnNpdCBTY2F0dGVycGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU1NjYXR0ZXIzLnBuZyk8L2NlbnRlcj4KCiMjIyoqQ3Jvc3N0YWIgVmlzdWFsaXphdGlvbnMgdXNpbmcgU2hpbnkgaW4gUioqCkNsaWNrIGhlcmUgdG8gYmUgdGFrZW4gdG8gb3VyIHB1Ymxpc2hlZCBTaGlueSBhcHA6IGh0dHBzOi8va3ZhdWdobi5zaGlueWFwcHMuaW8vcmVzdGF1cmFudF9pbnNwZWN0aW9uLwoKIyMjIypTYWZldHkgSW5kZXgqClRoaXMgdmlzdWFsaXphdGlvbiBzdGFydHMgd2l0aCBhIHNvbWV3aGF0LWFyYml0cmFyeSBLUEksIHRoZSAiU2FmZXR5IEluZGV4LCIgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYm90aCB0aGUgYXZlcmFnZSBzY29yZSBhbmQgdGhlIGxvd2VzdCBpbnNwZWN0aW9uIHNjb3JlIHJlY2VpdmVkIGZvciBhIGdpdmVuIHppcCBjb2RlIGluIGEgZ2l2ZW4geWVhci4gIEEgaGlnaCBTYWZldHkgSW5kZXggaW5kaWNhdGVzIGJvdGggYSBoaWdoIGF2ZXJhZ2Ugc2NvcmUgYW5kIGEgaGlnaCBtaW5pbXVtIHNjb3JlLiAgU2V0IHRoZSBwYXJhbWV0ZXJzIGhvd2V2ZXIgeW91IGxpa2UgKDMgYW5kIDggYXJlIHJlYXNvbmFibGUgZGVmYXVsdHMpIGFuZCBjaGVjayB0aGUgY3Jvc3N0YWIgdG8gc2VlIGVhY2ggemlwIGNvZGUncyByYXRpbmdzIG92ZXIgdGhlIGZvdXIteWVhciBwZXJpb2QuCgo8Y2VudGVyPiFbU2hpbnk6IFNhZmV0eSBJbmRleCBEYXRhXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQ3Jvc3MxQS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogU2FmZXR5IEluZGV4IENyb3NzdGFiXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQ3Jvc3MxQi5wbmcpPC9jZW50ZXI+CgojIyMjKkxvd2VzdCBJbnNwZWN0aW9uIFNjb3JlcyoKVGhpcyB2aXN1YWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byBzZXQgYW4gYXJiaXRyYXJ5IGN1dG9mZiBwb2ludCBhcyBhbiBhaWQgZm9yIGlkZW50aWZ5aW5nIGxvdyBpbnNwZWN0aW9uIHNjb3Jlcy4gIFRoZSBkZWZhdWx0IHZhbHVlLCA3MCwgaXMgdGhlIGN1dG9mZiBmb3IgcmVzdGF1cmFudCBpbnNwZWN0aW9uczsgbG93ZXIgc2NvcmVzIHdpbGwgdHJpZ2dlciBhIHJlaW5zcGVjdGlvbi4gIEFmdGVyIHNlbGVjdGluZyBhIHBhcmFtZXRlciB1c2luZyB0aGUgc2xpZGVyIGFuZCByZXF1ZXN0aW5nIGRhdGEsIHRoZSB1c2VyIGNhbiBzZWxlY3QgdGhlICJDcm9zc3RhYiIgdGFiIHRvIHNlZSB3aGljaCB6aXAgY29kZXMgYW5kIHllYXJzIGhhZCB1bmFjY2VwdGFibHkgbG93IGluc3BlY3Rpb24gc2NvcmVzLgoKPGNlbnRlcj4hW1NoaW55OiBMb3dlc3QgSW5zcGVjdGlvbiBTY29yZXMgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzMkEucG5nKTwvY2VudGVyPgo8YnI+CjxjZW50ZXI+IVtTaGlueTogTG93ZXN0IEluc3BlY3Rpb24gU2NvcmVzIENyb3NzdGFiXSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQ3Jvc3MyQi5wbmcpPC9jZW50ZXI+CgojIyMjKlBlb3BsZSBwZXIgUmVzdGF1cmFudCoKQXVzdGluIGlzIGEgZmFzdC1ncm93aW5nIGNpdHksIGFuZCBvdXIgcmVzdGF1cmFudCBzY2VuZSBpcyBjdXJyZW50bHkgYm9vbWluZyBhcyB3ZWxsLiAgVGhpcyB2aXN1YWxpemF0aW9uIGFsbG93cyBhIHVzZXIgdG8gc2VlIHdoZXJlIHRoZSBkZW5zaXR5IG9mIHJlc3RhdXJhbnRzIGNvbXBhcmVkIHRvIHBvcHVsYXRpb24gaXMgaGlnaGVzdC4gIFVzaW5nIGEgcHVibGljIHBvcHVsYXRpb24gZGF0YXNldCBnZW5lcmF0ZWQgYnkgdGhlIFVTIENlbnN1cywgd2UgY2FuIGZpbmQgdGhlIG51bWJlciBvZiBwZW9wbGUgcGVyIHJlc3RhdXJhbnQgaW4gYSBnaXZlbiB6aXAgY29kZTsgYXMgbW9yZSByZXN0YXVyYW50cyBhcmUgYWRkZWQgKG9yIGZhaWwpLCB0aGUgcGVvcGxlLXBlci1yZXN0YXVyYW50IG51bWJlciBjaGFuZ2VzLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGhpZ2hsaWdodCB0aGUgZGVuc2l0eSBvZiByZXN0YXVyYW50cyBpbiA3ODcwMSwgd2hpY2ggaXMgZG93bnRvd24gQXVzdGluLgoKPGNlbnRlcj4hW1NoaW55OiBQZW9wbGUgcGVyIFJlc3RhdXJhbnQgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzM0EucG5nKTwvY2VudGVyPiAKPGJyPgo8Y2VudGVyPiFbU2hpbnk6IFBlb3BsZSBwZXIgUmVzdGF1cmFudCBDcm9zc3RhYl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0Nyb3NzM0IucG5nKTwvY2VudGVyPgoKIyMjKipCYXJjaGFydCBWaXN1YWxpemF0aW9ucyB1c2luZyBTaGlueSBpbiBSKioKVGhlc2UgdmlzdWFsaXphdGlvbnMgYXJlIGFsc28gYWNjZXNzaWJsZSBhdCBodHRwczovL2t2YXVnaG4uc2hpbnlhcHBzLmlvL3Jlc3RhdXJhbnRfaW5zcGVjdGlvbi8KCiMjIyMqU2NvcmVzIGJ5IFppcCBDb2RlKgpCYXJjaGFydHMgY2FuIGJlIGEgZ29vZCB3YXkgdG8gcXVpY2tseSBpZGVudGlmeSB0cmVuZHMgdmlzdWFsbHkuICBJbiB0aGlzIHZpc3VhbGl6YXRpb24sIHRoZSB1c2VyIGNhbiBjcmVhdGUgYSBzZXQgb2YgemlwIGNvZGVzIG9mIGludGVyZXN0LCB0aGVuIHNlZSBlYWNoIHppcGNvZGUncyBhdmVyYWdlIHNjb3JlIHBlciB5ZWFyIG92ZXIgdGhlIHRocmVlIG9yIGZvdXIgeWVhcnMgY29udGFpbmVkIGluIHRoZSBkYXRhc2V0LgoKPGNlbnRlcj4hW1NoaW55OiBTY29yZXMgYnkgWmlwIENvZGUgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjFBLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBTY29yZXMgYnkgWmlwIENvZGUgQmFyIENoYXJ0XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQmFyMUIucG5nKTwvY2VudGVyPgoKIyMjIypUcmFuc2l0IHN0b3BzIGFuZCByZXN0YXVyYW50IGRlbnNpdHkqCkNhcGl0YWwgTWV0cm8sIHRoZSBBdXN0aW4tYXJlYSB0cmFuc2l0IHNlcnZpY2UsIGhhcyBtYWRlIGl0cyBkYXRhIGZyZWVseSBhdmFpbGFibGUgZm9yIHB1YmxpYyBkb3dubG9hZC4gIEJ5IGltcG9ydGluZyB0aGlzIGRhdGEgaW50byBnZW9ncmFwaGljIGluZm9ybWF0aW9uIHNvZnR3YXJlIChBcmNHSVMpIGFuZCBvdmVybGF5aW5nIHRoZSBjb29yZGluYXRlcyBvZiB0cmFuc2l0IHN0b3BzIG9uIGEgc2hhcGVmaWxlIG9mIHJlZ2lvbmFsIHppcCBjb2Rlcywgd2Ugd2VyZSBhYmxlIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdHJhbnNpdCBzdG9wcyBwZXIgemlwIGNvZGUuICBJbiB0aGlzIGJhciBjaGFydCwgd2UncmUgZXhhbWluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0cmFuc2l0IGRlbnNpdHkgYW5kIHJlc3RhdXJhbnQgZGVuc2l0eS4gIFVzZSB0aGUgc2xpZGVyIHRvIHNlbGVjdCB6aXAgY29kZXMgd2l0aCBtb3JlIHRoYW4gdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRyYW5zaXQgc3RvcHMsIHRoZW4gY29tcGFyZSB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIHRoZXNlIHppcCBjb2RlcyB0byB0aGUgYXZlcmFnZSBudW1iZXIgb2YgcmVzdGF1cmFudHMgcGVyIHppcCBjb2RlIHRocm91Z2hvdXQgdGhlIHJlZ2lvbi4gIFRoZSBibHVlIGxpbmUgaXMgdGhlIGNhbGN1bGF0ZWQgYXZlcmFnZSBmb3IgYWxsIG9mIHRoZSBzZWxlY3RlZCB6aXAgY29kZXMsIGFuZCB0aGUgcmVkIGlzIHRoZSBncmFuZCBhdmVyYWdlIGZvciBhbGwgb2YgdGhlIHppcGNvZGVzIGluIHRoZSBHcmVhdGVyIEF1c3RpbiBhcmVhLgoKPGNlbnRlcj4hW1NoaW55OiBSZXN0YXVyYW50IERlbnNpdHkgYW5kIFRyYW5zaXQgU3RvcHMgRGF0YV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjJBLnBuZyk8L2NlbnRlcj4gCjxicj4KPGNlbnRlcj4hW1NoaW55OiBSZXN0YXVyYW50IERlbnNpdHkgYW5kIFRyYW5zaXQgU3RvcHMgQmFyIENoYXJ0XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TQmFyMkIucG5nKTwvY2VudGVyPgoKIyMjIypOb25uYXRpdmUgcmVzaWRlbnRzIGFuZCByZXN0YXVyYW50IGRlbnNpdHkqCldvdWxkIHdlIGV4cGVjdCB6aXAgY29kZXMgd2l0aCBjb21wYXJhdGl2ZWx5IGxhcmdlIG51bWJlcnMgb2Ygbm9ubmF0aXZlIChuYXR1cmFsaXplZC1jaXRpemVuIG9yIG5vbmNpdGl6ZW4pIHJlc2lkZW50cyB0byBoYXZlIG1vcmUgb3IgZmV3ZXIgcmVzdGF1cmFudHMsIG9uIGF2ZXJhZ2UsIHRoYW4gemlwIGNvZGVzIHdpdGggbG93ZXIgcGVyY2VudGFnZXMgb2Ygbm9ubmF0aXZlIHJlc2lkZW50cz8gIFRoaXMgYmFyY2hhcnQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1pbmltdW0gcGVyY2VudGFnZSBvZiBub25uYXRpdmUgcmVzaWRlbnRzIHBlciB6aXAgY29kZSwgdGhlbiBzaG93cyB0aGUgbnVtYmVyIG9mIHJlc3RhdXJhbnRzIGluIHRoYXQgemlwIGNvZGUgYW5kIHRoZSBhdmVyYWdlIG51bWJlciBvZiByZXN0YXVyYW50cyBwZXIgemlwIGNvZGUgZm9yIGFsbCBvZiB0aGUgcXVhbGlmeWluZyB6aXAgY29kZXMuICBUaGlzIGF2ZXJhZ2UgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBncmFuZCBhdmVyYWdlIHRocm91Z2hvdXQgdGhlIGdyZWF0ZXIgQXVzdGluIGFyZWEsIHNob3duIGluIHJlZC4KCjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBOb25uYXRpdmUgUmVzaWRlbnRzIERhdGFdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1NCYXIzQS5wbmcpPC9jZW50ZXI+IAo8YnI+CjxjZW50ZXI+IVtTaGlueTogUmVzdGF1cmFudCBEZW5zaXR5IGFuZCBOb25uYXRpdmUgUmVzaWRlbnRzIEJhciBDaGFydF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU0JhcjNCLnBuZyk8L2NlbnRlcj4K
>>>>>>> fd5d49a0e53324f45c1a48a192d19a4d73915bca
>>>>>>> 4132fa34d178208600e7c040ceb934c37440208b